2014-02-15 46 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) 
}