2017-05-29 102 views
1

我目前使用Ruby的Net :: HTTP庫來查詢Newrelic端點。最近,這些查詢已經開始返回404了。我通過curl測試了我的確切查詢 - 希望能夠得到更詳細的錯誤消息 - 但通過curl查詢實際上會返回200與預期數據。所以這個查詢確實有效,並且我對Net :: HTTP爲什麼會在這時返回一個404有點不知所措。Net :: HTTP to Newrelic返回404,但curl返回200

以下是我到目前爲止的一些代碼片段,如果任何人都可以提供任何有關進一步嘗試的建議,那將非常感謝!

環境

  • 的JRuby 1.7.26(因此Ruby 1.9.3p551)
  • 滑軌3.2.21

Ruby代碼

uri = URI('https://NEWRELIC_HOST/PATH/ACCOUNT_ID/query') 
parameters = { :nrql => NRQL_QUERY_STRING } 
uri.query = URI.encode_www_form(parameters) 

request = Net::HTTP::Get.new(uri.to_s) 
request['X-Query-Key'] = NEWRELIC_QUERY_KEY 

Net::HTTP.start(uri.hostname, uri.port, {:use_ssl => true}) do |http| 
    response = http.request(request) 
end 

這會返回404錯誤代碼每次。我已經嘗試了一對有效的Newrelic端點/帳戶,每次都是404錯誤。

捲曲代碼

現在,如果我採取相同的請求,並踢它捲曲在命令行上,沒有任何問題,我得到的所有數據的200正確返回:

curl -H "X-Query-Key: NEWRELIC_QUERY_KEY" https://NEWRELIC_HOST/PATH/ACCOUNT_ID/query?NRQL_QUERY_STRING 
+0

它是否適用於其他終端而不是newrelic? – philipp

+0

如果你有權訪問服務器日誌,答案可能在 –

+0

@ philipp是的,我們在一些地方使用它來檢索數據,實際上我們使用Net :: HTTP從Newrelic檢索其他形式的數據,都工作正常 - 他們都遵循相同的格式。 – Krista

回答

1

嘗試改變

request = Net::HTTP::Get.new(uri.to_s) 

request = Net::HTTP::Get.new(uri.request_uri) 
+0

謝謝!你是對的 - 奇怪的是我也偶然發現了它,它確實有效!但是現在我只是想了解它爲什麼會崩潰......我們在我們所有的Net :: HTTP調用中都使用了uri.to_s,並且它一直工作 - 事實上它仍然適用於所有其他API調用 - 並且有一個他們中的很多。 – Krista

+0

另外值得一提的是,Newrelic技術支持能夠使用我們的代碼重現我們的問題,並且能夠通過簡單地使用'Net :: HTTP :: Get.new(uri)'來修復它 - 但實際上會導致其他地方的錯誤,我目前也試圖追查。我們最終可能會改變所有地方使用'uri.request_uri',但我也很想知道爲什麼會發生這種情況:) – Krista