我正在制作我的第一个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文档的船舶英雄养蜂场的链接。任何帮助将不胜感激。
答案 0 :(得分:2)
您不必自己解析请求正文。您需要的内容已由Rails准备好,您可以通过params
x = params["fulfillment"]["order_number"]
y = params["fulfillment"]["tracking_number"]
P.S。 request.body
是一个IO,因此只能读一次。