2012-04-04 4 views
1

Nets/HTTPを使用してPOSTを使用してカスタムユーザーエージェントを使用しようとしています。私は通常open-uriを使用しましたが、それはできませんPOSTできますか?カスタムヘッダー付きRubyのHTTP.post_form

私はでカスタムヘッダーをスローするように

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

がどのように私はこれを変更しますでしょうか?

私のクエリがある編集:

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

答えて

7

これを試すことができます。たとえば、

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

URLでエンコードされたクエリパラメータを既にお持ちの場合は、 。 Mineは 'Content-Type'ヘッダを設定し、クエリHashを変換します。 – henrikhodne

+0

@dvyjones:ええ、あなたの解決策もクールです:) –

+0

{parama = value、paramb = value2}タイプ情報を入力用に使うことはできますか(それをシリアル化するにはどうすればよいですか)試してみました。私はシリアル化する方法が分からないことを除いては? – Akshat

4

あなたはそれを行うためにpost_formを使用することはできませんが、あなたはこのようにそれを行うことができます。

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 

(詳細はnet/http documentationを読む)

+0

は、私はそれを私もuri.hostするuri.hostnameを変更しなければならなかったショットを与えました。奇妙なことは、まさにルビーのドキュメントだからです。 – Akshat

+0

使用しているRubyのバージョンは? – henrikhodne

+0

(あなたが使用していたと仮定していた1.9.3に 'URI#hostname'が追加されているようです) – henrikhodne

2

jsonをカスタムヘッダー付きのサーバーに投稿する必要がありました。私が見た他の解決策は私にとってはうまくいかなかった。ここに私の解決策が働いた。マイク・エバートのtumblrのに

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 

ありがとう: 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 
関連する問題