如何获取我的帖子数据?(原文为Nancy (C#): How do I get my post data?)

我正在使用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 ...”);
         返回“确定”;
     };

但是当我检查数据时(当我在上面放置断点时),我没有看到我的数据位于哪里(即params.body或params.headers)。 我怎样才能提取这些信息?

根据Corona上的文档,我应该正确发布它:[http://docs.coronalabs.com/daily/api/library/network/request.html](http://docs.coronalabs.com/daily/api/library/network/request.html)

点赞
用户178396
用户178396

该消息数据在

this.Request.Body

如果你有适当的类型,你可以使用模型绑定将数据反序列化为该类型:

var x = this.Bind<YourType>();
2014-07-26 11:35:48
用户2399640
用户2399640

这个实际上非常好用:

var body = this.Request.Body;
int length = (int)    body.Length; // 这是一个动态变量
byte[] data = new byte[length];
body.Read(data, 0, length);
Console.WriteLine(System.Text.Encoding.Default.GetString(data));
2015-03-08 13:40:12
用户3066753
用户3066753

理想情况下,使用简单的 Bind() 调用就可以获取您的帖子数据。然而,在 post 调用中使用 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 失败,而上述方法成功。

2016-05-13 14:34:15
用户527516
用户527516

这个可以使用 Nancy 扩展来实现。你需要包含相关的命名空间。

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

我喜欢这个方法的简洁性,它是 Nancy 超级简单路径的一部分。

但是请注意!该方法将流保留在末尾,所以后续调用会返回空字符串。为了解决这个问题,总是立即重置流,如下所示:

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

Nancy 2.0 应该会纠正这个问题,使得流位置默认重置。

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

2017-02-01 17:33:00
用户5536
用户5536

对于 Nancy 2.0.0, Request.Body现在是 Stream,而不是 RequestStream,所以没有 AsString 方法。然而,以下方法似乎可以:

using (var reqStream = RequestStream.FromStream(Request.Body))
{
    var body = reqStream.AsString();
    // ... do stuff with body
}
2018-11-07 15:10:55