Ruby未定义方法'bytesize' for #< Hash:0x2954fe8>

wfypjpf4  于 11个月前  发布在  Ruby
关注(0)|答案(5)|浏览(83)

我有以下Ruby代码,用于沙盒模式下的跟踪网站:

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代码。

4sup72z8

4sup72z81#

你发送的是散列形式的post数据。你应该把它编码成字符串。
例如使用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

guicsvcw

guicsvcw2#

request需要一个字符串作为它的第二个参数,它在这个参数上调用bytesize。你给它一个散列,它不响应bytesize

7vux5j2d

7vux5j2d3#

使用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)
}

字符串

ffdz8vbo

ffdz8vbo4#

我用.to_s解出来,它返回200。

@client.job.create_or_update(job_name, job_xml.get_xml.to_s)

字符串
这是我目前使用的Jenkins API客户端:https://github.com/arangamani/jenkins_api_client

ffx8fchx

ffx8fchx5#

我在使用rack/test测试POST/GET请求时遇到了类似的问题。在我的情况下,响应控制器没有使用JSON响应GET请求,而是使用Hash。
似乎POST请求需要在发送的数据上调用.to_s,在接收的数据上调用GET请求。

相关问题