如何使用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
相关产品推荐
相关产品推荐

