web-dev-qa-db-ja.com

ナンシー(C#):投稿データを取得するにはどうすればよいですか?

Corona SDKを使用して、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 )

サーバーでメッセージを受け取ります:

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

しかし、データをチェックするとき(ブレークポイントを設定するとき)、データの場所(つまり、params.bodyまたはparams.headers)がわかりません。この情報を抽出するにはどうすればよいですか?

POST Coronaのドキュメントによると、正しく: http://docs.coronalabs.com/daily/api/library/network/request.html

20
Jefecito

投稿データは

this.Request.Body

適切な型がある場合は、モデルバインディングを使用してデータを逆シリアル化できます。

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

これにはナンシー拡張機能があります。名前空間を含める必要があります。

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

私はナンシーの非常に簡単な道の一部である、これがいかに簡潔かが好きです。

しかし、注意の言葉!このメソッドはストリームを最後に残すため、後続の呼び出しは空の文字列を返します。これを修正するには、すぐに次のように常にストリームをリセットします:

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

Nancy 2.0はこれを修正して、デフォルトでストリーム位置がリセットされるようになっています。

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

12
Daniel Williams

これは実際にうまく機能します:

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

ナンシー2.0.0の場合、Request.BodyStreamではなくRequestStreamであるため、AsStringメソッドはありません。しかし、これはうまくいくようです:

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

理想的には、単純なBind()呼び出しで投稿データを取得できます。ただし、ポストコールでバインドを使用すると、一貫性のない結果が発生し、上記のスキームを使用することに頼りました。

Nancy Bind()が機能する場合と機能しない場合について、さまざまな議論を見てきました。適切に機能しているのは、リクエストの本文が次のように管理されていることを保証できる場所です。

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

ただし、WSO2インフラストラクチャ(サービスプロキシに送信されるJSONイベントディクショナリとしてシリアル化されたデータ)を介して同様に処理されるはずのデータ(確認できませんでした)を送信すると、上記のメソッドが成功する一方でバインドが失敗しました。

0
user33230