API响应中的JSON.parse不止一次?

时间:2016-07-09 04:11:16

标签: ruby-on-rails ruby json parsing

我正在制作我的第一个rails应用程序,这是一个连接到船舶英雄仓库管理系统的遗留电子商务框架。

我在某个问题上遇到了障碍。我创建了一个webhook并在船上的英雄api中注册了它。货物发货时,它会将数据发送到我创建的端点。我收到的参数如下:

在2016-07-08 15:22:02 -0400开始发布“/ ship”54.243.50.75

Processing by WebhooksController#shipment as */*

Parameters: {"{\"test\": \"0\", \"fulfillment\": {\"line_items\": "=>{"{\"id\": \"200CB01-606R\", \"quantity\": 1}"=>{", \"shipping_method\": \"UPS Ground\", \"shipping_carrier\": \"UPS\", \"tracking_number\": \"1Z89ER740392038191\", \"custom_tracking_url\": \"http://wwwapps.ups.com/WebTracking/track?track"=>"yes"}}, "trackNums"=>"1Z89ER740392038191\", \"shipping_address\": {\"address_city\": \"Brooklyn\", \"name\": \"XXX\", \"address1\": \"XXX\", \"address2\": \"APT 2A\", \"address_state\": \"NY\", \"address_country\": \"US\", \"address_zip\": \"11222\"}, \"order_number\": \"WS987182\"}}"}

我设置的控制器操作是:

def shipment
    if request.headers['Content-Type'] == 'application/json'
      data = JSON.parse(request.body.read)


       x = JSON.parse(request.body.read)["fulfillment"]["order_number"]
       y = JSON.parse(request.body.read)["fulfillment"]["tracking_number"]
       puts x
       puts y
      render nothing: true
    else
      # application/x-www-form-urlencodedw
      data = params.as_json


      x = JSON.parse(request.body.read)["fulfillment"]["order_number"]
      y = JSON.parse(request.body.read)["fulfillment"]["tracking_number"]
      puts x
      puts y
      render nothing: true
    end
  end

这会引发错误:JSON :: ParserError:JSON文本必须至少包含两个八位字节!但是如果我从每个条件中删除一个x或y变量,它会解析我正在寻找的正确值(跟踪号或订单号)。所以只要我只解析1个值就可以了。我不明白为什么。 Here是Webhook Shipment URL文档的船舶英雄养蜂场的链接。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:2)

您不必自己解析请求正文。您需要的内容已由Rails准备好,您可以通过params

访问它们
x = params["fulfillment"]["order_number"]
y = params["fulfillment"]["tracking_number"]

P.S。 request.body是一个IO,因此只能读一次。