最近项目从 Rails 3.2.16
升级到了 Rails 4.0
,但是并没有升级Grape
,因为工作量的原因,暂时想维持 Api 的现状,因为升级了没有时间去充分的测试,所以并没有升级Grape
,但是问题也就来了
凌晨突然微信响起,跟我们有 Api 接口接入的一家公司的技术反映所有的 Api 接口都是返回:
{ "message": "401 Unauthorized" }
然后自己测了一下,发现没问题啊,因为上线后已经都测试过的,所以感觉是不是使用上的问题?后来跟那边的工程师协同排查了下,发现他们是把所有的参数都放到Json
里面,而我们仅仅测试了Url Params
和Form
等形式。
接着开始排查问题,猜测应该是token
没有被拿到,在日志里面打出来params
一看,果然,json body
内的参数都不在params
内
为什么没写进params
呢?尝试了几个方法无果后,万能的 Google 向我投来慈祥的微笑:
Google Search: grape params not load from json body
于是找到这么一个帖子:Params is empty and I don't know why 帖子后面有一个 Issue 的链接:POST and PUT request params get dropped (rails 4, angularjs)
原来是Rails 4.0
的问题:
Rails forgets to rewind the input it reads.
解决方法就是升级Grape
到0.5.0
(Fix #417) 之后,或者使用Rails > 4.1
(Fixed)
我的临时解决方法是Issue
中提到的,新增config/initializers/grape.rb
文件:
module Grape
module Middleware
class Formatter < Base
alias_method :_read_body_input, :read_body_input
def read_body_input
env['rack.input'].rewind if env['rack.input']
_read_body_input
end
end
end
end
后面还是把Grape
升级了吧,希望有人遇到此类问题可以绕过去。
解决了问题,写了篇帖子 (写帖子比解决问题用时还长)
点上一根烟,深深抽了一口,望着窗外,心想,这苦逼的程序员啊…
总结:测试充分,充分测试