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
投稿データは
this.Request.Body
適切な型がある場合は、モデルバインディングを使用してデータを逆シリアル化できます。
var x = this.Bind<YourType>();
これにはナンシー拡張機能があります。名前空間を含める必要があります。
using Nancy.Extensions;
var text = Context.Request.Body.AsString();
私はナンシーの非常に簡単な道の一部である、これがいかに簡潔かが好きです。
しかし、注意の言葉!このメソッドはストリームを最後に残すため、後続の呼び出しは空の文字列を返します。これを修正するには、すぐに次のように常にストリームをリセットします:
Request.Body.Seek(0, SeekOrigin.Begin);
Nancy 2.0はこれを修正して、デフォルトでストリーム位置がリセットされるようになっています。
これは実際にうまく機能します:
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));
ナンシー2.0.0の場合、Request.Body
はStream
ではなくRequestStream
であるため、AsString
メソッドはありません。しかし、これはうまくいくようです:
using (var reqStream = RequestStream.FromStream(Request.Body))
{
var body = reqStream.AsString();
// ... do stuff with body
}
理想的には、単純な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イベントディクショナリとしてシリアル化されたデータ)を介して同様に処理されるはずのデータ(確認できませんでした)を送信すると、上記のメソッドが成功する一方でバインドが失敗しました。