我正在使用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)。我该如何提取这些信息?
我应该按照Corona上的文档正确发布:http://docs.coronalabs.com/daily/api/library/network/request.html
答案 0 :(得分:32)
帖子数据在
this.Request.Body
如果您有合适的类型,可以使用模型绑定对数据进行反序列化:
var x = this.Bind<YourType>();
答案 1 :(得分:12)
这有一个Nancy扩展。您需要为其添加命名空间。
using Nancy.Extensions;
var text = Context.Request.Body.AsString();
我喜欢这是多么简洁,是南希的超级简单路径的一部分。
但请注意!此方法将流保留在末尾,因此后续调用将返回空字符串。要解决此问题,请务必立即重置流,如下所示:
Request.Body.Seek(0, SeekOrigin.Begin);
Nancy 2.0应该对此进行更正,以便默认情况下重置流位置。
答案 2 :(得分:7)
这实际上很有效:
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));
答案 3 :(得分:2)
对于Nancy 2.0.0,Request.Body
是Stream
而不是RequestStream
,因此没有AsString
方法。但是,这似乎可行:
using (var reqStream = RequestStream.FromStream(Request.Body))
{
var body = reqStream.AsString();
// ... do stuff with body
}
答案 4 :(得分:0)
理想情况下,可以通过简单的Bind()调用来获取您的帖子数据。但是,我在通话后使用Bind时看到了不一致的结果,以至于我已经使用了上述方案。
我已经看过关于Nancy Bind()工作和不工作的各种讨论......我已经看过Post和但都无法解释这种不一致。在我看到它正常运行的地方,我可以保证请求的主体管理如下:
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事件字典),Bind在上述方法成功时失败。