2016-12-01 55 views
0

我有一个非常简单的API,我想发表的帖子中使用Ruby和不使用GEM只是建在图书馆net/httpuriopenssl如果需要的话。红宝石的Net :: HTTP使用SSL

无论如何,我使用下面的代码来做出一个非常简单的POST请求,但得到一些非常奇怪的结果,并希望其他人看到这一点。

我也在POSTMAN和NodeJS中测试了同样的请求,并且按照预期工作,唯一一个我无法工作的是Ruby。

require 'uri' 
require 'net/http' 
require 'openssl' 

url = URI("https://somesite.dev/devices") 

http = Net::HTTP.new(url.host, url.port) 
http.use_ssl = true 
http.verify_mode = OpenSSL::SSL::VERIFY_NONE 
request = Net::HTTP::Post.new(url) 
request["key"] = '1234567' 

response = http.request(request) 
puts response.read_body 

结果是我之前没有见过的:我收到标题key两次......所以日志的API显示这样的查询:

SELECT * FROM device where key = '1234567, 1234567' LIMIT ...

如前所述上面我可以通过POSTMAN或NodeJS发出相同的请求并获得正确的结果。

注意:因为我有本地API的副本,所以我可以在本地测试,但它不是SSL,它遍布http。在本地进行请求时,它工作得很好。所以从我可以告诉这个问题只在SSL引入时自我介绍。

任何帮助将是惊人的!谢谢!!

红宝石版2.2.1

+0

除非你正在创建一个新的协议,否则我建议使用其中一个已建立的[Ruby HTTP客户端](https://www.ruby-toolbox.com/categories/http_clients),而不是Net :: HTTP。重新造一个轮子会浪费很多时间,并会造成很多挫折。使用哪个是你自己决定的。 SSL不会导致这个问题,它只是一个管道。没有更多的代码,我们不能真正诊断问题,我们只能猜测;也许服务器端API在处理数据的SSL方面存在问题。阅读“[问]”和链接页面,“[mcve]”将有所帮助。 –

+0

API已经被检查过了,我可以在POSTMAN或其他在NodeJS中测试的编程语言和Curl一起请求相同的请求,并且它们都按预期工作。我尝试过使用rest-client并得到相同的问题,所以我现在想退出一个GEM,看看我能否弄清楚发生了什么。 – gregwinn

+0

好吧,考虑到这一点,SSL管道被Rails和各种其他客户端测试得非常严重,所以如果发生数据重复,或者数据出现损坏,它会在整个过程中发生。并且与代码交谈的任何系统存在问题。我们需要能够根据问题中的代码来复制问题,因此我们需要更多信息。您的Ruby版本已过期,这会影响Ruby及其OpenSSL。也许更新它会有所帮助。 –

回答

0

的问题是东西我没有在我最初的问题列表。 API正在使用AWS API网关,并且在导致此奇怪问题的方法上启用了HTTP_PROXY。我删除HTTP_PROXY后,问题解决了,上面的代码工作!