2016-07-09 6 views
0

Ich mache meine erste Rails App, die eine Verbindung zu einem alten E-Commerce-Framework für das Ship Hero Warehouse Management System ist.JSON.parse auf eine API-Antwort mehr als einmal?

Ich treffe eine Wand auf ein bestimmtes Problem. Ich habe einen Webhook erstellt und in der ship hero api registriert. Wenn eine Sendung ausgeht, sendet sie Daten an einen Endpunkt, den ich erstellt habe. Ich erhielt die Parameter wie so:

POST Started "/ Schiff" für 54.243.50.75 bei 2016-07-08 15:22:02 -0400

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\"}}"}

die Controller-Aktion ich habe eingerichtet ist:

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 

dies auf einen Fehler wirft: JSON :: ParserError: Ein JSON Text muss mindestens zwei Bytes! Aber wenn ich eine der x- oder y-Variablen aus jeder Bedingung entferne, parst sie den korrekten Wert, nach dem ich suche (die Verfolgungsnummer oder die Auftragsnummer). Solange ich nur 1 Wert parse, funktioniert es. Ich verstehe nicht warum. Here ist der Link zur Schiffsheld-Imkerei für die Webhook Shipment URL-Dokumentation. Jede Hilfe würde sehr geschätzt werden.

Antwort

2

Sie müssen den Anforderungskörper nicht selbst analysieren. Was Sie brauchen, ist bereits von Rails vorbereitet worden, und man kann auf sie zugreifen durch params

x = params["fulfillment"]["order_number"] 
y = params["fulfillment"]["tracking_number"] 

P. S. request.body ist ein IO und kann daher nur einmal gelesen werden.

+0

Ich bekomme tatsächlich einen Fehler damit. NoMethodError (undefinierte Methode '[] 'für nil: NilClass): app/controllers/webhooks_controller.rb: 61: in' sendung' –

+0

Wenn der Fehler im obigen Code ausgelöst wurde, dann sollten Sie überprüfen, ob 'params [" fulfillment "]' ist 'nil', oder Sie können [strong parameters] (http://edgeguides.rubyonrails.org/action_controller_overview.html#strong-parameters) nutzen. 'params.require (: fulfillment)', die sofort eine Antwort * 422 Unprocessable Entity * sendet, wenn "fulfillment" fehlt. – Aetherus

Verwandte Themen