2012-10-31 20 views
19

Wysyłam żądanie z niestandardowymi nagłówkami do usługi internetowej.Wysyłanie żądania wpisu http w języku Ruby przez sieć :: HTTP

require 'uri' 
require 'net/http' 

uri = URI("https://api.site.com/api.dll") 
https = Net::HTTP.new(uri.host, uri.port) 
https.use_ssl = true 
headers = 
{ 
    'HEADER1' => "VALUE1", 
    'HEADER2' => "HEADER2" 
} 

response = https.post(uri.path, headers) 
puts response 

To nie działa, mam otrzymaniu błędu:

/usr/lib/ruby/1.9.1/net/http.rb:1932:in `send_request_with_body': undefined method `bytesize' for #<Hash:0x00000001b93a10> (NoMethodError) 

Jak mogę rozwiązać ten problem?

P.S. Ruby 1.9.3

Odpowiedz

12

Drugi argument Net::HTTP#post musi być String zawierający dane do opublikowania (często tworzą dane), nagłówki będą w opcjonalnym trzecim argumencie.

+9

Jaki jest tutaj kod roboczy? – rh4games

7

Spróbuj tego:

Dla szczegółowej dokumentacji, spójrz na to: http://www.rubyinside.com/nethttp-cheat-sheet-2940.html

require 'uri' 
require 'net/http' 

uri = URI("https://api.site.com/api.dll") 
https = Net::HTTP.new(uri.host, uri.port) 
https.use_ssl = true 

request = Net::HTTP::Post.new(uri.path) 

request["HEADER1"] = 'VALUE1' 
request["HEADER2"] = 'VALUE2' 

response = https.request(request) 
puts response 
+0

W jaki sposób mogę umieścić ciało json z tym?> –

+1

'data = {" aaa "=>" 111 "} .to_json; request.body = "[# {data}]" ' –

0

Jak qqx wspomniano, drugi argument Net::HTTP#post musi być String

szczęście istnieje zadowalająca funkcja, która konwertuje hasz na wymagany ciąg:

response = https.post(uri.path, URI.encode_www_form(headers)) 
Powiązane problemy