南希(C#):如何获取我的帖子数据?

时间:2014-07-26 10:22:36

标签: c# lua corona nancy

我正在使用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

5 个答案:

答案 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应该对此进行更正,以便默认情况下重置流位置。

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

答案 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.BodyStream而不是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在上述方法成功时失败。