2016-12-01 54 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後,問題解決了,上面的代碼工作!