Nancy(C#): ¿Cómo obtengo mis datos de publicación?
lua corona (5)
Esto realmente funciona muy bien:
var body = this.Request.Body;
int length = (int) body.Length; // this is a dynamic variable
byte[] data = new byte[length];
body.Read(data, 0, length);
Console.WriteLine(System.Text.Encoding.Default.GetString(data));
Estoy usando Corona SDK para publicar datos en mi servidor C #:
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 )
Recibo un mensaje en el servidor:
Post["/UpdateHand"] = x =>
{
Console.WriteLine("Received ...");
return "Ok";
};
Pero cuando verifico los datos (cuando los coloco en un punto de interrupción) no veo dónde se localizan mis datos (es decir, params.body o params.headers). ¿Cómo puedo extraer esta información?
Debería publicarlo correctamente de acuerdo con la documentación en Corona: http://docs.coronalabs.com/daily/api/library/network/request.html
Hay una extensión de Nancy para esto. Tendrá que incluir el espacio de nombres para ello.
using Nancy.Extensions;
var text = Context.Request.Body.AsString();
Me gusta lo conciso que es esto, parte del camino fácil de super-duper de Nancy.
¡Sino una palabra de advertencia! Este método deja la secuencia al final, por lo que las llamadas posteriores devolverán una cadena vacía. Para solucionar esto, siempre reinicie la secuencia inmediatamente después, así:
Request.Body.Seek(0, SeekOrigin.Begin);
Se supone que Nancy 2.0 corrige esto para que la posición del flujo se restablezca de forma predeterminada.
Lo ideal sería que obtuvieras los datos de tu publicación con una simple llamada Bind (). Sin embargo, he visto resultados inconsistentes al usar un enlace en una llamada posterior, por lo que he recurrido al uso del esquema descrito anteriormente.
He visto varias discusiones sobre Nancy Bind () trabajando y no trabajando ... He visto ambas cosas con Post pero no puedo explicar la inconsistencia. Donde vi que funcionaba correctamente era donde podía garantizar que el cuerpo de la solicitud se gestionaba de la siguiente manera:
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);
}
Sin embargo, al enviar datos que deberían haberse manejado de manera similar (aunque no pude confirmar) a través de la infraestructura WSO2 (los datos serializados como un diccionario de eventos JSON enviados a un proxy de servicio), el enlace falló mientras el método anterior tuvo éxito.
Los datos del post están en
this.Request.Body
Si tiene el tipo adecuado, puede deserializar sus datos utilizando el enlace del modelo:
var x = this.Bind<YourType>();
Para Nancy 2.0.0, Request.Body
es un Stream
lugar de un RequestStream
, por lo que no tiene un método AsString
. Sin embargo, esto parece funcionar:
using (var reqStream = RequestStream.FromStream(Request.Body))
{
var body = reqStream.AsString();
// ... do stuff with body
}