Как заставить Ruby соблюдать подчеркивание в заголовке Net :: HTTP - PullRequest
2 голосов
/ 24 марта 2020

Как я могу заставить Ruby соблюдать подчеркивание в заголовке Net::HTTP?

uri = URI.parse(url)
headers = { 'api_key': 'my_private_key' }
request = Net::HTTP::Post.new(uri, headers)
http = Net::HTTP.new(uri.host, uri.port)
response = http.request(request)

В этом случае публикуемый заголовок на самом деле Api-Key и API, который я пытаюсь использовать для интеграции фактически требуется api_key - регистр символов с подчеркиванием.

1 Ответ

0 голосов
/ 25 марта 2020

Net :: HTTP заставляет заголовки соответствовать значению c в отношении заглавных букв и знаков препинания. Вы можете исправить это различными способами (в зависимости от версии Net :: HTTP), но на данный момент все эти решения довольно стары. Независимо от этого, исправление ошибок сторонними библиотеками - это путь к катастрофе.

Любой клиент, использующий Net :: HTTP, как и HTTParty, сталкивается с такой же проблемой. Вы можете прочитать о некоторых из этих обходных путей на https://github.com/jnunemaker/httparty/issues/406, но опять же я не рекомендую их.

Вы можете прочитать больше о проблемах с подчеркиванием в заголовках HTTP на Почему мой настраиваемый заголовок иногда отсутствует? и Почему HTTP-серверы запрещают подчеркивание в именах заголовков HTTP .

Более простое решение - использовать typhoeus , который оборачивает libcurl вместо того, чтобы полагаться на Net :: HTTP. Вот самая быстрая демонстрация того, как это работает в Typhoeus:

require 'typhoeus'
request = Typhoeus.get('www.example.com', headers: {'foo_bar' => 'baz'})
=> #<Typhoeus::Response:0x00007fdf3aa717e8 @options={:httpauth_avail=>0, :total_time=>0.336714, :starttransfer_time=>0.336496, :appconnect_time=>0.0, :pretransfer_time=>0.26573, :connect_time=>0.265662, :namelookup_time=>0.00133, :redirect_time=>0.0, :effective_url=>"www.example.com", :primary_ip=>"93.184.216.34", :response_code=>200, :request_size=>129, :redirect_count=>0, :return_code=>:ok, :response_headers=>"HTTP/1.1 200 OK\r\nAge: 459799\r\nCache-Control: max-age=604800\r\nContent-Type: text/html; charset=UTF-8\r\nDate: Tue, 24 Mar 2020 21:29:22 GMT\r\nEtag: \"3147526947+ident\"\r\nExpires: Tue, 31 Mar 2020 21:29:22 GMT\r\nLast-Modified: Thu, 17 Oct 2019 07:18:26 GMT\r\nServer: ECS (ord/4CD5)\r\nVary: Accept-Encoding\r\nX-Cache: HIT\r\nContent-Length: 1256\r\n\r\n", :response_body=>"<!doctype html>\n<html>\n<head>\n    <title>Example Domain</title>\n\n    <meta charset=\"utf-8\" />\n    <meta http-equiv=\"Content-type\" content=\"text/html; charset=utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n    <style type=\"text/css\">\n    body {\n        background-color: #f0f0f2;\n        margin: 0;\n        padding: 0;\n        font-family: -apple-system, system-ui, BlinkMacSystemFont, \"Segoe UI\", \"Open Sans\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n        \n    }\n    div {\n        width: 600px;\n        margin: 5em auto;\n        padding: 2em;\n        background-color: #fdfdff;\n        border-radius: 0.5em;\n        box-shadow: 2px 3px 7px 2px rgba(0,0,0,0.02);\n    }\n    a:link, a:visited {\n        color: #38488f;\n        text-decoration: none;\n    }\n    @media (max-width: 700px) {\n        div {\n            margin: 0 auto;\n            width: auto;\n        }\n    }\n    </style>    \n</head>\n\n<body>\n<div>\n    <h1>Example Domain</h1>\n    <p>This domain is for use in illustrative examples in documents. You may use this\n    domain in literature without prior coordination or asking for permission.</p>\n    <p><a href=\"https://www.iana.org/domains/example\">More information...</a></p>\n</div>\n</body>\n</html>\n", :debug_info=>#<Ethon::Easy::DebugInfo:0x00007fdf3b3dbf40 @messages=[]>}, @request=#<Typhoeus::Request:0x00007fdf3aa72c60 @base_url="www.example.com", @original_options={:headers=>{"foo_bar"=>"baz"}, :method=>:get}, @options={:headers=>{"User-Agent"=>"Typhoeus - https://github.com/typhoeus/typhoeus", "foo_bar"=>"baz", "Expect"=>""}, :method=>:get, :maxredirs=>50}, @on_progress=[], @on_headers=[], @response=#<Typhoeus::Response:0x00007fdf3aa717e8 ...>, @on_complete=[], @on_success=[]>>

Затем проверьте правильность установки заголовков в вашем запросе:

request.request.options[:headers]
=> {
    "User-Agent" => "Typhoeus - https://github.com/typhoeus/typhoeus",
       "foo_bar" => "baz",
        "Expect" => ""
}

Но даже в этом случае обратите внимание на полное стек, который может обрабатывать эти заголовки как подчеркивания, все еще порой проблематичен c для различных компонентов в стеке.

Я уже однажды отвечал на аналогичный вопрос в { ссылка }.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...