2014-07-26 13 views
17

Ich verwende Corona SDK Daten zu meinem C# Server zu schreiben:Nancy (C#): Wie bekomme ich meine Postdaten?

headers["Content-Type"] = "application/x-www-form-urlencoded" 
headers["Accept-Language"] = "en-US" 

local body = "color=red&size=small" 

local params = {} 
params.headers = headers 
params.body = body 

network.request(host .. "/UpdateHand", "POST", nwListener, params) 

ich eine Nachricht auf dem Server erhalten:

Post["/UpdateHand"] = x => 
     { 
      Console.WriteLine("Received ..."); 
      return "Ok"; 
     }; 

Aber wenn ich überprüfen Sie die Daten (wenn ich einen Haltepunkt setzen auf es) Ich sehe nicht, wo meine Daten sind (dh die params.body oder params.headers). Wie kann ich diese Informationen extrahieren?

ich sollte es POST richtig entsprechend der Dokumentation auf Corona: http://docs.coronalabs.com/daily/api/library/network/request.html

+0

Wenn Sie Modell nicht verwenden möchten, verbindlich, lesen Sie in dieser Antwort http://stackoverflow.com/a/30571313/790465 –

Antwort

22

Die Post-Daten ist in

this.Request.Body 

Wenn Sie geeignete Art haben, können Sie Ihre Daten, um es verbindlich mit Modell deserialisieren:

var x = this.Bind<YourType>(); 
+0

Danke, ich habe nicht einen geeigneten Typ für die Moment, also habe ich den ersten gemacht. Meine Ausgabe ist, wenn ich var b = this.Request.Body, ist "Nancy.IO.RequestStream". Sollte das nicht der Körper erhalten, wie er gesendet wird? – Jefecito

+0

Ok, also scheint dies etwas von der gewünschten Ausgabe zu geben: var id = this.Request.Body; Byte [] Daten = neues Byte [10]; id.Read (Daten, 0, 5); Console.WriteLine (System.Text.Encoding.Default.GetString (Daten)); – Jefecito

+14

Wenn Speicher dient, gibt es eine AsString-Erweiterungsmethode für RequestStream, so dass Sie den Body als String abrufen können, indem Sie dies tun.Request.Body.AsString() –

6

Das funktioniert tatsächlich groß:

0

Im Idealfall erhalten Sie Ihre Postdaten mit einem einfachen Bind() -Aufruf. Allerdings habe ich inkonsistente Ergebnisse bei der Verwendung einer Bindung in einem Post-Aufruf gesehen, so dass ich das oben beschriebene Schema verwendet habe.

Ich habe verschiedene Diskussionen über Nancy Bind() arbeiten und nicht arbeiten gesehen ... Ich habe beide mit Post gesehen, kann aber die Inkonsistenz nicht erklären. Wo ich es sah Funktion war richtig, wo ich der Körper des Antrags wie folgt verwaltet wurde garantieren konnte:

 var data = Encoding.ASCII.GetBytes (postData); 

     request.Method = "POST"; 
     request.ContentType = "application/json"; 
     request.ContentLength = data.Length; 

     using (var stream = request.GetRequestStream()) { 
      stream.Write (data, 0, data.Length); 
     } 

jedoch beim Senden von Daten, die in ähnlicher Weise behandelt wurden, sollten durch WSO2 Infrastruktur (obwohl ich nicht bestätigen konnte) (Daten serialisiert als JSON-Ereigniswörterbuch, das an einen Dienstproxy gesendet wird), Bind ist fehlgeschlagen, während die obige Methode erfolgreich war.

7

Es gibt eine Nancy-Erweiterung für diese. Sie müssen den Namespace dafür angeben.

using Nancy.Extensions; 
var text = Context.Request.Body.AsString(); 

Ich mag, wie prägnant das ist, Teil von Nancy's Super-Duper einfachen Weg.

Aber ein Wort der Vorsicht! Diese Methode lässt den Stream am Ende, sodass nachfolgende Aufrufe eine leere Zeichenfolge zurückgeben. Um dies zu beheben, setzen Sie immer den Strom unmittelbar danach, etwa so:

Request.Body.Seek(0, SeekOrigin.Begin); 

Nancy 2.0 soll dies korrigieren, so dass die Stromposition standardmäßig zurückgesetzt wird.

https://github.com/NancyFx/Nancy/pull/2158

+0

Verwenden von Nancy 2.0.0 - aber 'Context.Request.Body' ist ein' System.IO.Stream' - also kein 'AsString' verfügbar :( –