我有一个非常简单的API,我想发表的帖子中使用Ruby和不使用GEM只是建在图书馆net/http
,uri
和openssl
如果需要的话。红宝石的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
除非你正在创建一个新的协议,否则我建议使用其中一个已建立的[Ruby HTTP客户端](https://www.ruby-toolbox.com/categories/http_clients),而不是Net :: HTTP。重新造一个轮子会浪费很多时间,并会造成很多挫折。使用哪个是你自己决定的。 SSL不会导致这个问题,它只是一个管道。没有更多的代码,我们不能真正诊断问题,我们只能猜测;也许服务器端API在处理数据的SSL方面存在问题。阅读“[问]”和链接页面,“[mcve]”将有所帮助。 –
API已经被检查过了,我可以在POSTMAN或其他在NodeJS中测试的编程语言和Curl一起请求相同的请求,并且它们都按预期工作。我尝试过使用rest-client并得到相同的问题,所以我现在想退出一个GEM,看看我能否弄清楚发生了什么。 – gregwinn
好吧,考虑到这一点,SSL管道被Rails和各种其他客户端测试得非常严重,所以如果发生数据重复,或者数据出现损坏,它会在整个过程中发生。并且与代码交谈的任何系统存在问题。我们需要能够根据问题中的代码来复制问题,因此我们需要更多信息。您的Ruby版本已过期,这会影响Ruby及其OpenSSL。也许更新它会有所帮助。 –