我在Rails控制器中有一个api方法,如下所示:
def login
if !request || !request.headers
render :json => {:error => I18n.t('error_must_provide_api_key_or_token')}, :status => :unauthorized and return
end
api_key = params['X-Api-Key']
if api_key.nil?
api_key = request.headers['X-Api-Key']
end
... rest of method ...
该方法首先检查我们是否有请求,以及该请求是否有标头。然后,我想要做的是检查名为X-Api-Key
的标头变量。我首先检查params
哈希值,如果找不到那个,我会检查request.headers
哈希值。
我不明白为什么我必须检查这两个。以前,我有:
api_key = request.headers['X-Api-Key']
当我在本地计算机上进行调试时,这种方法有效,但是一旦我推送到生产服务器并在生产模式下运行,它就无法工作。相反,以下内容:
api_key = params['X-Api-Key']
当我推送到生产服务器时工作,但在本地运行时不起作用。
我的本地计算机正在运行MacOS,而rbenv 1.1.0正在运行ruby 2.4.0p0和rails 5.1.1。
我的服务器是Ubuntu 16.04并使用rails 4.2.5运行ruby 2.1.4p265。
答案 0 :(得分:0)
例如(使用curl,-H代表标题)
使用为参数编码的url,
curl -H 'X-Api-Key: 1234' http://localhost:3000/cars?X-Api-Key=abc
或使用http请求正文,application/json
作为内容类型。
curl -X GET -H 'X-Api-Key: 1234' -H "Content-Type: application/json" -d '{"X-Api-Key": "abc" }' http://localhost:3000/cars
request.headers['X-Api-Key]
会返回1234
params['X-Api-Key']
将返回abc
。所以这里发生的事情可能是,在本地你通过http标头发送X-Api-Key
,而在生产中你通过url编码或http请求体发送它作为json的内容类型。
要解决这个问题,
如果您想支持两种方式,请提供X-Api-Key
然后你上面写的内容有意义。
如果您只想支持http标头,请更改生产客户端代码,通过http请求标头发送X-Api-Key。
如果您只想支持参数,请更改本地代码,通过http请求正文或编码网址发送X-Api-Key。