1

Вопрос по post, http, ruby, ruby-on-rails – HTTP.post_form в Ruby с пользовательскими заголовками

Я пытаюсь использовать Nets / HTTP для использованияPOST и вставьте пользовательский пользовательский агент. Я обычно использовалopen-uri но это не может сделатьPOST может это?

я использую

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

Как бы я изменил это, чтобы добавить пользовательские заголовки?

Изменить мой запрос:

query = {'a'=>'b'}
  • Могу ли я использовать {parama = value, paramb = value2} информацию о типе для ввода (Как бы я его сериализовал) Я попробовал это, и это кажется потрясающим! За исключением того, что я не знаю, как сериализовать?

    от Akshat
  • Я сделал это, но мне пришлось сменить имя uri.host на uri.host. Странно, потому что именно это в рубиновых документах.

    от Akshat
  • (URI#hostname кажется, был добавлен в 1.9.3, который я предполагал, что вы использовали. Извини за это.)

    от
  • Какую версию Ruby вы используете?

    от
  • @ Акшат: Хорошая работа! :)

    от
  • Понял, я использовал адресуемый / URI

    от Akshat
  • Если у вас уже есть URL-адрес ваших параметров запроса, это, вероятно, так же хорошо, как и мое. Мина устанавливаетContent-Type заголовок и конвертирует запрос Hash, хотя.

    от
  • @dvyjones: да, ваше решение тоже круто :)

    от
  • -1

    Code:

    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
    

  • 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)
    

  • 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 документация для получения дополнительной информации)

  • 2

    Мне нужно было отправить JSON на сервер с пользовательскими заголовкам

    и. Другие решения, которые я рассмотрел, не сработали для меня. Вот мое решение, которое сработало.

    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
    

    Спасибо благодаря Tumblr Майка Эберта: http://mikeebert.tumblr.com/post/56891815151/posting-json-with-nethttp