【问题标题】:MultiJson::LoadError: 795: unexpected token when trying to parse incoming body requestMultiJson::LoadError: 795: 尝试解析传入正文请求时出现意外令牌
【发布时间】:2015-03-09 20:57:13
【问题描述】:

我在尝试解析 Sinatra 应用程序上的传入请求时失去理智。

这是我的规格

 payload = File.read("./spec/support/fixtures/payload.json")
 post "/api/v1/verify_payload", { :payload => payload }
 last_response.body.must_equal payload

这里只是 spec/support/fixtures/payload.json

{"ref":"refs/heads/master"}

我的路线看起来像

post '/verify_payload' do
  params =  MultiJson.load(request.body.read, symbolize_keys: true)
  params[:payload]
end

运行规范时出现以下错误:

MultiJson::LoadError: 795: unexpected token at 'payload=%7B%22ref%22%3A%22refs%2Fheads%2Fmaster%22%7D'

我尝试以不同的方式解析正文请求,但没有运气。

如何使请求成为有效的 JSON?

谢谢

【问题讨论】:

    标签: ruby json sinatra


    【解决方案1】:

    如果要发送 JSON 编码的 POST 正文,则必须将 Content-Type 标头设置为 application/json。使用 Rack::Test,您应该能够做到这一点:

    post "/api/v1/verify_payload", payload, 'CONTENT_TYPE' => 'application/json'
    

    或者:

    header 'Content-Type' => 'application/json'
    post '/api/v1/verify_payload'
    

    更多信息在这里:http://www.sinatrarb.com/testing.html

    【讨论】:

    • post "/api/v1/verify_payload", payload, 'CONTENT_TYPE' => 'application/json' 产生完全相同的错误。
    • 是的,有效载荷仍被视为%7B%22ref%22%3A%22refs%2Fheads%2Fmaster%22%7D,而不是正确格式化。
    • 如果 request.body 仍然包含 payload=,这对我来说没有任何意义,因为您没有在新帖子中发送有效负载密钥。
    【解决方案2】:

    问题在于您传递的是 ruby​​ 哈希,格式不正确,您应该传递一个 json 对象。

    这样的东西,应该可以工作:

    发布“/api/v1/verify_payload”,{ :payload => payload.to_json }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-17
      • 1970-01-01
      • 1970-01-01
      • 2017-01-24
      相关资源
      最近更新 更多