2012-04-04 6 views
1

Ich versuche, Nets/HTTP zu verwenden, um POST zu verwenden, und einen benutzerdefinierten Benutzeragenten einzugeben. Ich habe in der Regel open-uri verwendet, aber es kann nicht tun POST kann es?HTTP.post_form in Ruby mit benutzerdefinierten Headern

Ich benutze

resp, data = Net::HTTP.post_form(url, query) 

Wie würde ich dies in benutzerdefinierte Header zu werfen ändern?

bearbeiten meine Frage ist:

query = {'a'=>'b'} 

Antwort

7

Sie können dies versuchen, zum Beispiel:

http = Net::HTTP.new('domain.com', 80) 
path = '/url' 

data = 'form=data&more=values' 
headers = { 
    'Cookie' => cookie, 
    'Content-Type' => 'application/x-www-form-urlencoded' 
} 

resp, data = http.post(path, data, headers) 
+0

Wenn Sie Ihre Abfrageparameter bereits URL-codiert haben, ist dies wahrscheinlich genauso gut wie meins . Mine setzt den 'Content-Type'-Header und konvertiert einen Abfrage-Hash. – henrikhodne

+0

@dvyjones: yeah, deine Lösung ist auch cool :) –

+0

Kann ich {parama = value, paramb = value2} Typ Info für die Eingabe verwenden (Wie würde ich es serialisieren) Ich habe es versucht und es scheint genial! Außer ich kann nicht serialisieren? – Akshat

4

Sie können nicht post_form verwenden, das zu tun, aber man kann es wie folgt tun:

uri = URI(url) 
req = Net::HTTP::Post.new(uri.path) 
req.set_form_data(query) 
req['User-Agent'] = 'Some user agent' 

res = Net::HTTP.start(uri.hostname, uri.port) do |http| 
    http.request(req) 
end 

case res 
when Net::HTTPSuccess, Net::HTTPRedirection 
    # OK 
else 
    res.value 
end 

(Lesen Sie den net/http documentation für weitere Informationen)

+0

gab ich ihm einen Schuss ich uri.hostname ändern musste allerdings uri.host. Seltsam, weil es genau das in den Ruby Docs ist. – Akshat

+0

Welche Version von Ruby verwenden Sie? – henrikhodne

+0

("URI # hostname" scheint in 1.9.3 hinzugefügt worden zu sein, was ich angenommen habe. Sorry.) – henrikhodne

2

Ich musste Json auf einen Server mit benutzerdefinierten Headern buchen. Andere Lösungen, die ich mir ansah, funktionierten nicht für mich. Hier war meine Lösung, die funktioniert hat.

uri = URI.parse("http://sample.website.com/api/auth") 
params = {'email' => '[email protected]'} 
headers = { 
    'Authorization'=>'foobar', 
    'Date'=>'Thu, 28 Apr 2016 15:55:01 MDT', 
    'Content-Type' =>'application/json', 
    'Accept'=>'application/json'} 

http = Net::HTTP.new(uri.host, uri.port) 
response = http.post(uri.path, params.to_json, headers) 
output = response.body 
puts output 

Dank wegen Mike Ebert tumblr: http://mikeebert.tumblr.com/post/56891815151/posting-json-with-nethttp

-1
require "net/http" 

uri = URI.parse('https://your_url.com') 
http = Net::HTTP.new(uri.host, uri.port) 
http.use_ssl = true 
http.ca_path='/etc/pki/tls/certs/' 
http.ca_file='/etc/pki/tls/certs/YOUR_CERT_CHAIN_FILE' 
http.cert = OpenSSL::X509::Certificate.new(File.read("YOUR_CERT)_FILE")) 
http.key = OpenSSL::PKey::RSA.new(File.read("YOUR_KEY_FILE")) 

#SSLv3 is cracked, and often not allowed 
http.ssl_version = :TLSv1_2 

#### This is IMPORTANT 
http.verify_mode = OpenSSL::SSL::VERIFY_NONE 

#Crete the POST request 
request = Net::HTTP::Post.new(uri.request_uri) 
request.add_field 'X_REMOTE_USER', 'soap_remote_user' 
request.add_field 'Accept', '*' 
request.add_field 'SOAPAction', 'soap_action' 
request.body = request_payload 

#Get Response 
response = http.request(request) 

#Review Response 
puts response.body 
Verwandte Themen