2014-02-15 48 views
11

我有以下的Ruby代碼,在沙盒模式跟蹤網站:紅寶石未定義的方法`bytesize」爲#<哈希:0x2954fe8>

require "net/http" 
require "net/https" 
require "uri" 

xml = <<XML 
<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?><data appname="dhl_entwicklerportal" language-code="de" password="Dhl_123!" request="get-status-for-public-user"><data piece-code="00340433836536550280"></data></data> 
XML 

uri = URI('https://cig.dhl.de/services/sandbox/rest/sendungsverfolgung') 

nhttp = Net::HTTP.new(uri.host, uri.port) 
nhttp.use_ssl=true 
nhttp.verify_mode=OpenSSL::SSL::VERIFY_NONE 
request = Net::HTTP::Get.new(uri) 
request.basic_auth 'xpackageWP', 'hidden' 
response = nhttp.start {|http| 
http.request(request, xml:xml) 
} 

puts response.body 

我總是得到錯誤:

d:/Ruby200/lib/ruby/2.0.0/net/http/generic_request.rb:179:in `send_request_with_body' undefined method `bytesize' for #<Hash:0x2954fe8> (NoMethodError) 
from d:/Ruby200/lib/ruby/2.0.0/net/http/generic_request.rb:130:in `exec' 
from d:/Ruby200/lib/ruby/2.0.0/net/http.rb:1404:in `block in transport_request' 
from d:/Ruby200/lib/ruby/2.0.0/net/http.rb:1403:in `catch' 
from d:/Ruby200/lib/ruby/2.0.0/net/http.rb:1403:in `transport_request' 
from d:/Ruby200/lib/ruby/2.0.0/net/http.rb:1376:in `request' 
from D:/Dropbox_5BHIF/Dropbox/TempDHL/Main.rb:17:in `block in <main>' 
from d:/Ruby200/lib/ruby/2.0.0/net/http.rb:852:in `start' 
from D:/Dropbox_5BHIF/Dropbox/TempDHL/Main.rb:16:in `<main>' 

我都非常努力解決這個問題,但我想不出任何問題的。 當我與鏈接,然後一個?XML瀏覽器測試它=它完美的作品,所以它似乎與我的Ruby代碼有問題。

+0

你用'GET'請求一起提交'xml'? – bjhaid

回答

24

你發送後的數據作爲哈希值。您應該將其編碼爲字符串。

例如使用URI::encode_www_form

request = Net::HTTP::Post.new(uri) 
... 
response = nhttp.start do |http| 
    post_data = URI.encode_www_form({xml: xml}) 
    http.request(request, post_data) 
end 

UPDATE如果你想要的GET請求,追加查詢字符串的URL。

post_data = URI.encode_www_form({xml: xml}) 
uri = URI('https://cig.dhl.de/services/sandbox/rest/sendungsverfolgung?' + 
      post_data) 

... 

response = nhttp.start do |http| 
    http.request(request) 
end 
+0

謝謝,這解決了我的問題,但生成了一個新的^^也許你也可以幫助我:服務器預計以下格式:https://cig.dhl.de/services/sandbox/rest/sendungsverfolgung/?xml = 我認爲這將實現,但顯然它沒有。你也有解決方案嗎? – Crusader633

+0

@ Crusader633,我更新了答案。順便說一句,你確定服務器期望GET嗎? – falsetru

0

request預計,其第二個參數,在其上調用bytesize的字符串。你給它一個散列,它不響應bytesize

+0

我應該如何更改我的要求?瀏覽器需要以下格式:link?xml = ...我無法想出如何實現該目標 – Crusader633

1

使用POST而不是GET要求

xml = <<XML 
<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?><data 

appname="dhl_entwicklerportal" language-code="de" password="Dhl_123!" request="get-status-for-public-user"><data piece-code="00340433836536550280"></data></data> 
XML 

uri = URI('https://cig.dhl.de/services/sandbox/rest/sendungsverfolgung') 

nhttp = Net::HTTP.new(uri.host, uri.port) 
nhttp.use_ssl=true 
nhttp.verify_mode=OpenSSL::SSL::VERIFY_NONE 
request = Net::HTTP::Post.new(uri) 
request.body = xml 
request.basic_auth 'xpackageWP', 'hidden' 
response = nhttp.start {|http| 
    http.request(request) 
}