Я использую Rails 3.2.1 для создания HTTP-поста.
Мне нужно добавить X-FORWARDED
FOR в шапку. Как мне это сделать в Rails?
Код:
post_data = {
"username" => tabuser
}
response = Net::HTTP.post_form(URI.parse("http://<my php file>"), post_data)
Я использую Rails 3.2.1 для создания HTTP-поста.
Мне нужно добавить X-FORWARDED
FOR в шапку. Как мне это сделать в Rails?
Код:
post_data = {
"username" => tabuser
}
response = Net::HTTP.post_form(URI.parse("http://<my php file>"), post_data)
Это можно установить для объекта запроса:
request = Post.new(url)
request.form_data = params
request['X-Forwarded-For'] = '203.0.113.195'
request.start(url.hostname, url.port,
:use_ssl => url.scheme == 'https' ) {|http|
http.request(request) }
Посмотрите эти примеры Net :: HTTP:
https://github.com/augustl/net-http-cheat-sheet/blob/master/headers.rb
Я считаю это более читабельным
require "net/http"
require "uri"
url = URI.parse("http://www.whatismyip.com/automation/n09230945.asp")
req = Net::HTTP::Get.new(url.path)
req.add_field("X-Forwarded-For", "0.0.0.0")
req.add_field("Accept", "*/*")
res = Net::HTTP.new(url.host, url.port).start do |http|
http.request(req)
end
puts res.body
украден из http://www.dzone.com/snippets/send-custom-headers-rub
ТЕМ НЕ МЕНИЕ !!
если вы хотите отправить заголовок "Accept" (Accept: application/json
) в приложение Rails, вы не можете сделать это:
req.add_field("Accept", "application/json")
но делайте:
req['Accept'] = 'application/json'
Причина в том, что Rails игнорирует заголовок Accept, когда он содержит ',/' или '/,' и возвращает HTML (который добавляет add_field
). Это связано с тем, что действительно старые браузеры отправляют неправильные заголовки "Принять".
Оба ответа в порядке, но я бы добавил одну важную вещь. Если вы используете https, вы должны добавить строку, в которой вы используете ssl:
url = URI.parse('https://someurl.com')
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
req = Net::HTTP::Get.new(url.request_uri)
req["header_name"] = header
response = http.request(req)
Без этого use_ssl вы получите "EOFError (конец файла достигнут)".
Первоначальный вопрос был для http-поста, который я и искал. Я собираюсь включить это решение для тех, кто может искать:
require 'net/http'
uri = URI.parse("http://<my php file>")
header = {'X-Forwarded-For': '0.0.0.0'}
# Create the HTTP objects
http = Net::HTTP.new(uri.host, uri.port)
request = Net::HTTP::Post.new(uri.request_uri, header)
# Send the request
response = http.request(request)