2017-06-17 1 views
0

Was ich will ist eine POST-Anfrage in kemal, wo der Körper eine bestimmte Anzahl von Schlüsseln/Werte, die ich will, und dann ein beliebiges JSON-Objekt, das ich nur stringifizieren und weitergeben und später wieder zu JSON parsen.Get JSON in POST in kemal

Mein Problem ist, dass ich anscheinend die Typen nicht richtig bekommen kann. Denken Sie an einen potenziellen JSON Körper wie folgt aus:

{ 
    "endpoint": "http://example.com", 
    "interval": 500, 
    "payload": { 
     "something": "else", 
     "more": { 
      "embedded": 1 
     } 
    } 
} 

Nun, was ich zu tun versucht, ist die folgende:

require "kemal" 

post "/schedule" do |env| 
    endpoint = env.params.json["endpoint"].as(String) 
    interval = env.params.json["interval"].as(Int64) 
    payload = String.from_json(env.params.json["payload"].as(JSON::Any)) 

    # ... move things along 

    env.response.content_type = "application/json" 
    { id: id }.to_json 
end 

Kemal.run 

nun offenbar, was ich scheine immer, wenn „Nutzlast“ Zugriff ist etwas vom Typ Hash(String, JSON::Type), was mich ein wenig verwirrt.

Irgendwelche Ideen, wie ich in der Lage wäre, nur einen Sub-JSON aus dem Anfragetext zu bekommen, ihn in String umzuwandeln und zurück zu JSON?

Antwort

1

Aktualisiert: payload ist eine Art von JSON::Type. Casting und dann Calling .to_json macht den Trick.

require "kemal" 

post "/schedule" do |env| 
    endpoint = env.params.json["endpoint"].as(String) 
    interval = env.params.json["interval"].as(Int64) 
    payload = env.params.json["payload"].as(JSON::Type) 
    env.response.content_type = "application/json" 
    payload.to_json 
end 

Kemal.run 
+0

Hmm, aber jetzt 'payload_as_string.to_json' gibt einen String, kein gültiges Dokument json ... wie folgt aus: "{\" etwas \“ => \ "else \", \ "mehr \" => {\ "embedded \" => 1}} " – tpei

+0

Die Antwort wurde aktualisiert –