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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 00:38:15