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 для различных компонентов в стеке.
Я уже однажды отвечал на аналогичный вопрос в { ссылка }.