如何强制 Ruby 尊重 Net::HTTP 标头中的下划线

2024-03-14

我如何强制 Ruby 尊重 a 中的下划线Net::HTTP header?

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-- 区分大小写,带下划线。


Net::HTTP 强制标头满足大小写和标点符号方面的规范。您可以通过多种方式对其进行猴子修补(取决于 Net::HTTP 的版本),但这些解决方案目前都相当陈旧。无论如何,对第三方库进行猴子修补会导致灾难。

任何依赖 Net::HTTP 的客户端(例如 HTTParty)都有同样的问题。您可以在以下位置阅读其中一些解决方法:https://github.com/jnunemaker/httparty/issues/406 https://github.com/jnunemaker/httparty/issues/406,但我再次不推荐它们。

您可以阅读有关 HTTP 标头中下划线问题的更多信息:为什么我的自定义标头有时不存在? https://stackoverflow.com/q/58292976/3784008 and 为什么 HTTP 服务器禁止 HTTP 标头名称中使用下划线 https://stackoverflow.com/q/22856136/3784008.

更简单的解决方案是使用typhoeus https://github.com/typhoeus/typhoeus它包装了 libcurl 而不是依赖于 Net::HTTP。以下是斑疹伤寒如何发挥作用的最快演示:

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" => ""
}

但即便如此,请注意可能正在处理这些标头的完整堆栈,因为下划线有时对于堆栈中的各个组件仍然存在问题。

我之前回答过一次类似的问题https://stackoverflow.com/a/58459132/3784008 https://stackoverflow.com/a/58459132/3784008.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何强制 Ruby 尊重 Net::HTTP 标头中的下划线 的相关文章

随机推荐

  • 如何使用 blas 以最佳方式转置矩阵?

    我正在做一些计算 并对不同 BLAS 实现的优势和弱点进行一些分析 但是我遇到了一个问题 我正在测试 cuBlas 在 GPU 上执行 linAlg 似乎是一个好主意 但有一个问题 cuBlas 实现使用列主格式 并且由于这不是我最终需要的
  • 推入数组后变量值发生变化[重复]

    这个问题在这里已经有答案了 所以我正在测试这段代码 我在网络控制台中得到以下输出 value 0 Array Object value 1 Array Object Object 数组中的所有对象都具有完全相同的值 name value 1
  • UdpClient 在广播地址上接收

    在 c 中 我使用 UdpClient Receive 函数 public void StartUdpListener Object state try udpServer new UdpClient new IPEndPoint IPAd
  • 在启动时运行 R 脚本

    首先 这可能需要移至超级用户 我无法决定哪个场地更好 我正在尝试编写一个将在启动 重新启动时运行的 R 脚本 并将该计算机添加到池中doRedis http cran r project org web packages doRedis i
  • 角度指令 - 文件读取器在文件加载时未触发

    我正在尝试读取 angularjs 中上传的图像文件的数据 但正如预期的那样 文件读取器onload功能不起作用 任何人都可以帮助我解决此问题并读取图像文件以获取其数据 这是我的代码 app directive uploadImageFil
  • boost::计算流压缩

    如何使用 boost compute 进行流压缩 例如 如果您只想对数组中的某些元素执行繁重的操作 首先 生成掩码数组 其中包含与要执行操作的元素相对应的元素 mask 0 0 0 1 1 0 1 0 1 然后对掩码数组进行排它扫描 前缀和
  • Unity 从脚本创建 UI 控件

    我通过代码创建了一个切换 但它不会显示 此外 我无法更改文本字段的位置 我尝试了很多 但没有任何效果 这是我当前的版本 也许你看到了错误 我是 Unity 的新手 这非常困难 public class Game MonoBehaviour
  • Posix 线程问题

    我试图通过示例来理解 pthreads 我编写了以下代码 每次运行时都会给出不同的答案 有人可以解释一下这个错误吗 TIA 斯维亚 代码在这里 include
  • 如何从现有的 Azure 服务主体获取客户端密钥

    我已经创建了启用 RBAC 的服务主体 https learn microsoft com en us cli azure ad sp view azure cli latest在 Azure 中使用环境变量在我的操作系统中配置 Key V
  • 当我单击可扩展子元素时,如何获取 EditBox 和 RadioButton 的每个值?

    我有一个可扩展的 ListView 其中每个父视图都有一个子视图 在子视图中 我有一个子子元素 EditText TextView 和 RadioButton 子元素在单选按钮上单击时具有不同的值 并且在输入后编辑文本值 类别活动 java
  • ACCESS/SQL:如何同时插入/更新?

    这是我的情况 首先 我不是在关系数据库上工作 我只是使用访问作为操作数据的简单方法 目前 我有很多桌子 一个主表 我们称之为 MAIN 还有大约 10 个其他表 我们可以称之为 X1 X2 X3 等 X1 表包含具有 X1 属性的项目 X2
  • 在.NET v4.0中解析MP3文件

    如何解析 MP3 文件以获取其所有属性 另外如何编辑MP3文件的属性 NET v4 0 中有可用的类吗 这些属性称为 ID3 标签 我认为 NET 框架不负责提供对它们的阅读 这是来自 SourceForge 的一些代码 http sour
  • 在 MacOS X 上的 GHCi 中工作的 Haskell 图形库

    是否存在满足以下要求的 Haskell 图形库或绑定到外部库 可以使用从ghci 即我不必链接并重新启动程序 适用于 MacOS X 与 1 结合使用很棘手 可以制作简单的矢量图形 线条 多边形 简单的填充和描边 可以将位图图像放在屏幕上
  • 在lisp中,如何使用floor函数返回的第二个值?

    当我这样做时 4楼3 我得到了 1 1 3 但我该如何使用这 1 3 呢 例如 您可以使用将其绑定到变量multiple value bind multiple value bind quot rem floor 4 3 format t
  • 移动 Safari 与主屏幕 Web 应用程序

    我正在为 iOS 开发一个 web 应用程序 我注意到在移动 safari 上运行和从主屏幕运行之间存在一些奇怪的事情 是否有任何资源可以提供在模式之间切换的通用接口 如果没有 是否有任何资源详细说明这两种模式之间的所有差异和陷阱 我遇到过
  • 将数据从节点传递到jade?

    问题是我渲染视图并发送一些数据 console log products shows an array res render seller sell shop id req user shop id products products 我将
  • Spring Data Rest - 如何从页面中删除元素?

    我的项目中有以下 REST 控制器方法 RequestMapping method GET value applications produces MediaType APPLICATION JSON VALUE public Respon
  • GitHub Probot:错误 probot:签名与事件负载和秘密不匹配

    我正在尝试使用构建 GitHub 应用程序机器人框架 https probot github io 这是文件的内容index js module exports robot gt robot log Yay the app was load
  • docker-compose restart 连接池已满

    我和我的团队正在使用 docker compose 将我们的一些基础设施转换为 docker 一切似乎都工作得很好 我遇到的唯一问题是重新启动它给我一个连接池已满错误 我正在尝试找出造成这种情况的原因 如果我删除 2 个容器或 1 个完整设
  • 如何强制 Ruby 尊重 Net::HTTP 标头中的下划线

    我如何强制 Ruby 尊重 a 中的下划线Net HTTP header uri URI parse url headers api key my private key request Net HTTP Post new uri head