2014-02-15 10 views
11

Ich habe folgende Ruby-Code, für eine Tracking-Website im Sandbox-Modus:Rubin nicht definierte Methode `BYTESIZE‘ für # <Hash: 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 

ich immer den Fehler:

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>' 

Ich habe wirklich versucht, das zu lösen, aber ich kann mir kein Problem vorstellen. Wenn ich es im Browser mit dem Link und dann ein? Xml = es funktioniert perfekt testen, so scheint es ein Problem mit meinem Ruby Code zu sein.

+0

reichen Sie eine 'xml' zusammen mit einer' GET' Anfrage? – bjhaid

Antwort

24

Sie senden Postdaten als Hash. Sie sollten es als Zeichenfolge codieren.

Zum Beispiel verwenden 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 Wenn Sie Anfrage erhalten möchten, fügen Sie die Query-String an die 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

Danke, das löst mein Problem, aber erzeugt ein neues ^^ Wahrscheinlich kannst du mir auch dabei helfen: Der Server erwartet das folgende Format: https: //cig.dhl.de/services/sandbox/rest/sendungsverfolgung/?xml= ich dachte, dass dies das erreichen wird, aber offensichtlich nicht. Haben Sie auch dafür eine Lösung? – Crusader633

+0

@ Crusader633, aktualisierte ich die Antwort. Übrigens, sind Sie sicher, dass der Server GET erwartet? – falsetru

0

request erwartet eine Zeichenfolge für das zweite Argument, auf dem bytesize aufgerufen wird. Sie geben ihm einen Hash, der nicht auf bytesize reagiert.

+0

Wie soll ich meine Anfrage ändern? Der Browser benötigt folgendes Format: link? Xml = ... ich kann mir nicht überlegen, wie ich das sonst erreichen könnte – Crusader633

1

Verwenden POST und nicht GET Anfrage

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) 
} 
Verwandte Themen