Rails 记从 Rails 3.2.16 升级到 Rails 4.0 遇到的 Grape 的问题

Zoker · 2015年10月24日 · 最后由 hww 回复于 2015年10月24日 · 2447 次阅读

最近项目从 Rails 3.2.16 升级到了 Rails 4.0,但是并没有升级Grape,因为工作量的原因,暂时想维持 Api 的现状,因为升级了没有时间去充分的测试,所以并没有升级Grape,但是问题也就来了

凌晨突然微信响起,跟我们有 Api 接口接入的一家公司的技术反映所有的 Api 接口都是返回:

{ "message": "401 Unauthorized" }

然后自己测了一下,发现没问题啊,因为上线后已经都测试过的,所以感觉是不是使用上的问题?后来跟那边的工程师协同排查了下,发现他们是把所有的参数都放到Json里面,而我们仅仅测试了Url ParamsForm等形式。

接着开始排查问题,猜测应该是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.

解决方法就是升级Grape0.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升级了吧,希望有人遇到此类问题可以绕过去。

解决了问题,写了篇帖子 (写帖子比解决问题用时还长)

点上一根烟,深深抽了一口,望着窗外,心想,这苦逼的程序员啊…

总结:测试充分,充分测试

所以测试非常重要,吸烟有害健康。

Rails 升级可以试试@flyerhzmSynvert

#1 楼 @lgn21st 是啊,后面要严抓测试流程。 #2 楼 @roclv 我们手动升级的,参加 RubyConf 之后用了这个工具跑了一下,没什么大改动。

#3 楼 @zoker 以前参与的项目也有这种情况,后来因为添加测试又导致项目延期,最后折衷方案就是重构的部分一定先写测试

需要 登录 后方可回复, 如果你还没有账号请 注册新账号