挂载的Rack应用程序解析的Rails的POST参数格式错误

时间:2019-05-16 05:18:54

标签: ruby-on-rails json sinatra rack

我看到将Rails应用程序从4.2升级到5.0后,由于参数格式错误导致Web请求失败,由于宝石依赖,该应用程序还将rack从1.6升级到了2.0。

该请求是带有表单数据的简单POST: {"id":"5ec3a6896a7c4781a581030c1714384b"}

Rails应用程序将此请求路由到本身正在运行Sinatra服务器的已安装Rack应用程序。以前,这可以读取从env哈希值生成的请求正文,该哈希值是由Rails路由器传递给Rack应用程序的:

# Rails 4.2 and rack 1.6:
Rack::Request.new(env).body.read
=> "{\"id\":\"5ec3a6896a7c4781a581030c1714384b\"}"

然后,Sinatra可以以此调用JSON.parse并使用生成的参数哈希。但是,升级后,输入是不同的,并且不是JSON可解析的:

# Rails 5.0 and rack 2.0:
Rack::Request.new(env).body.read
=> "%7B%22id%22:%225ec3a6896a7c4781a581030c1714384b%22%7D"

这看起来像是以前输入的某种CGI转义版本:

CGI.parse("%7B%22id%22:%225ec3a6896a7c4781a581030c1714384b%22%7D")
=> {"{\"id\":\"5ec3a6896a7c4781a581030c1714384b\"}"=>[]}

尽管我可以重写Sinatra端点的所有参数检索,但这似乎使我的代码更加脆弱,并回避了一些上游问题。纠正此问题的理想位置在哪里?

0 个答案:

没有答案