我是网络编程新手,现在遇到将一些xml数据发送到服务器的问题。
我有以下代码:
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="034234"></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 'hidden', 'hidden'
response = nhttp.start {|http|
http.request(request, xml: xml)
}
puts response.body
虽然我得到了一些回应,但这不是正确的。由于某种原因,它不能正确发送身体(我的xml)。如果我手动输入URL:
https://cig.dhl.de/services/sandbox/rest/sendungsverfolgung?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="034234"></data></data>
它有效。
--------------------------- EDIT ------------------- ------------
我按照Alex Wayne的解决方案编辑了上面的代码。现在我收到了这个错误:
d:/Ruby200/lib/ruby/2.0.0/net/http/generic_request.rb:179:in `send_request_with_body': undefined method `bytesize' for #<Hash:0x29bcff8> (NoMethodError)
答案 0 :(得分:3)
HTTP GET
请求不能有正文,因此第二个参数是作为查询字符串附加到url的数据。您可能希望使用支持真实请求正文的POST
。
http.request_post(request, xml)
更新:我想我误解了......
根据有效的查询字符串,它与GET
一起使用。但它期望XML在?xml=
之后。因此,您需要将请求正文/查询字符串编码为散列,其中xml
作为键,xml字符串作为值。
所以不是这个:
http.request(request, xml)
# GET http://domain.com/path?<myxml></myxml>
但是这个:
http.request(request, xml: xml)
# GET http://domain.com/path?xml=<myxml></myxml>