Rails中RestClient自动修改x-api-key请求头致403,如何阻止?
解决RestClient自动修改请求头名称的问题
问题原因
RestClient依赖Ruby标准库的Net::HTTP实现请求,而Net::HTTP默认会自动规范化请求头名称——将每个单词的首字母大写(比如x-api-key会被转成X-Api-Key)。虽然这符合HTTP规范的建议,但部分服务会严格校验请求头的大小写,导致返回403。
解决方案
方案一:改用Net::HTTP直接发起请求
绕过RestClient,直接使用Net::HTTP可以完全控制请求头的格式,不会自动转换名称:
require 'net/http' require 'json' # 构建请求URI uri = URI("#{@url}/#{path}") http = Net::HTTP.new(uri.host, uri.port) http.use_ssl = uri.scheme == 'https' # 处理HTTPS请求 # 根据请求方法创建对应请求对象 request = case method.downcase when 'get' Net::HTTP::Get.new(uri) when 'post' req = Net::HTTP::Post.new(uri) req.body = your_request_body.to_json # 如果有POST请求体,按需添加 req when 'put' Net::HTTP::Put.new(uri) # 其他方法如DELETE、PATCH同理 end # 直接设置原始请求头,不会被自动转换 request['Content-Type'] = 'application/json' request['Authorization'] = "Bearer 111" request['x-api-key'] = "12354" request['Accept'] = 'application/json;odata.metadata=minimal;odata.streaming=true' # 执行请求并处理响应 response = http.request(request) response_body = response.body.present? ? JSON.parse(response.body) : {}
方案二:Monkey Patch Net::HTTP阻止头名称规范化
如果不想替换RestClient,可以通过修改Net::HTTP的行为,阻止它自动转换请求头名称。在你的请求代码前添加以下补丁:
# 补丁:让Net::HTTP不再修改请求头名称 module Net class HTTPHeader def capitalize(name) name # 直接返回原始头名称,跳过规范化逻辑 end end end # 之后正常使用你的RestClient代码即可 headers = { 'Content-Type' => 'application/json', 'Authorization' => "Bearer 111", 'x-api-key' => "12354", 'Accept' => 'application/json;odata.metadata=minimal;odata.streaming=true' } params = { method: method, url: "#{@url}/#{path}", headers: headers } request = RestClient::Request.new params response = request.execute response_body = response.body.present? ? JSON.parse(response.body) : {}
注意:这种全局补丁会影响所有使用Net::HTTP的代码,建议只在需要的作用域内加载,避免引发其他问题。
内容的提问来源于stack exchange,提问作者andresV
相关产品推荐
相关产品推荐

