web-dev-qa-db-fra.com

Nancy (C #): Comment puis-je obtenir les données de mon message?

J'utilise Corona SDK pour publier des données sur mon serveur 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 )

Je reçois un message sur le serveur:

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

Mais lorsque je vérifie les données (lorsque j'y mets un point d'arrêt), je ne vois pas où mes données sont localisées (c'est-à-dire le params.body ou params.headers). Comment puis-je extraire ces informations?

Je devrais POST correctement selon la documentation sur Corona: http://docs.coronalabs.com/daily/api/library/network/request.html

21
Westerlund.io

Les données de publication sont en

this.Request.Body

Si vous avez un type approprié, vous pouvez désérialiser vos données en utilisant la liaison de modèle:

var x = this.Bind<YourType>();
34
Christian Horsdal

Il existe une extension Nancy pour cela. Vous devrez y inclure l'espace de noms.

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

J'aime à quel point c'est concis, une partie du chemin facile du super-duper de Nancy.

Mais attention! Cette méthode laisse le flux à la fin, donc les appels suivants renverront une chaîne vide. Pour résoudre ce problème, réinitialisez toujours le flux immédiatement après, comme suit:

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

Nancy 2.0 est censé corriger cela afin que la position du flux soit réinitialisée par défaut.

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

13
Daniel Williams

Cela fonctionne vraiment 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));
7
Joseph Philbert

Pour Nancy 2.0.0, Request.Body est un Stream plutôt qu'un RequestStream, donc n'a pas de méthode AsString. Cependant, cela semble fonctionner:

using (var reqStream = RequestStream.FromStream(Request.Body))
{
    var body = reqStream.AsString();
    // ... do stuff with body
}
2
Paul Stephenson

Idéalement, obtenir vos données de publication pourrait être accompli avec un simple appel Bind (). Cependant, j'ai vu des résultats incohérents lors de l'utilisation d'une liaison dans un appel de poste, de sorte que j'ai eu recours au schéma décrit ci-dessus.

J'ai vu diverses discussions sur Nancy Bind () fonctionnant et ne fonctionnant pas ... J'ai vu les deux avec Post mais je ne peux pas expliquer l'incohérence. Là où je l'ai vu fonctionner correctement, j'ai pu garantir que le corps de la demande était géré comme suit:

        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);
        }

Cependant, lors de l'envoi de données qui auraient dû être traitées de la même manière (bien que je n'ai pas pu le confirmer) via l'infrastructure WSO2 (données sérialisées en tant que dictionnaire d'événements JSON envoyés à un proxy de service), Bind a échoué alors que la méthode ci-dessus a réussi.

0
user33230