You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Rack::Test发送自定义请求头?

解决Rack::Test自定义请求头无法传入应用的问题

我太懂你折腾两天的憋屈了——明明照着网上的示例写,自定义请求头就是死活进不了应用,换了各种写法都没用,真的让人头大!结合你的环境(Ruby 2.5.1、Rack 2.0.4、Rack::Test 1.0.0),我帮你排查下核心问题:

1. 别被老示例坑了:参数顺序才是关键

很多网上的旧示例用的是 method(address, body, headers) 这种结构,但在你用的Rack::Test 1.0.0版本里,正确的参数顺序是这样的:

# GET请求格式:get(path, params = {}, env = {})
# POST请求格式:post(path, params = {}, env = {})

这里的第三个参数env才是存放请求头的地方,而且Rack规范要求自定义请求头必须用HTTP_前缀,同时把连字符转成下划线、字母大写。比如你要传X-My-Custom-Header,得写成HTTP_X_MY_CUSTOM_HEADER。

举个实际可用的例子:

# 方式1:直接在请求里传入headers
get '/api/your-endpoint', {}, {'HTTP_X_MY_CUSTOM_HEADER' => 'hello-world'}

# 方式2:用更直观的header辅助方法先设置,再发请求
header 'X-My-Custom-Header', 'hello-world'
get '/api/your-endpoint'

2. 验证请求头是否真的传入

你可以在应用里打印request.env来确认,比如在Sinatra应用里加一行:

get '/api/your-endpoint' do
  puts request.env.select { |k, v| k.start_with?('HTTP_') } # 只打印请求头相关的环境变量
  # 你的业务逻辑...
end

运行测试后看控制台输出,就能清楚看到自定义的请求头有没有被正确传递。

3. 为什么老示例没用?

因为早期版本的Rack::Test参数结构不同,有些示例可能基于0.9.x版本,参数顺序是method(path, headers, params),但到1.0.0之后统一调整成了现在的格式,这就是你照着老代码写没用的核心原因!

按照上面的方法调整后,你的自定义请求头应该就能正常传入应用了,快去试试吧!

内容的提问来源于stack exchange,提问作者Dimitri

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:12:02