gpt4 book ai didi

asp.net-mvc - MVC Controller : get JSON object from HTTP body?

转载 作者:IT老高 更新时间:2023-10-28 12:43:59 30 4
gpt4 key购买 nike

我们有一个 MVC (MVC4) 应用程序,它有时可能会收到一个 JSON 事件从第三方发布到我们的特定 URL(“http://server.com/events/”)。 JSON 事件在 HTTP POST 的正文中,并且正文是严格的 JSON(Content-Type: application/json - 不是在某些字符串字段中带有 JSON 的表单发布)。

如何在 Controller 主体中接收 JSON 主体?我尝试了以下但没有得到任何东西

[Edit]:当我说 什么都没有得到时,我的意思是 jsonBody 始终为 null,无论我是否将其定义为 Object字符串

[HttpPost]
// this maps to http://server.com/events/
// why is jsonBody always null ?!
public ActionResult Index(int? id, string jsonBody)
{
// Do stuff here
}

请注意,如果我使用强类型输入参数声明方法,MVC 会执行整个解析和过滤,即

// this tested to work, jsonBody has valid json data 
// that I can deserialize using JSON.net
public ActionResult Index(int? id, ClassType847 jsonBody) { ... }

但是,我们得到的 JSON 非常多样化,因此我们不想为每个 JSON 变体定义(和维护)数百个不同的类。

我正在通过以下 curl 命令(此处使用 JSON 的一种变体)对此进行测试

curl -i -H "Host: localhost" -H "Content-Type: application/json" -X POST http://localhost/events/ -d '{ "created": 1326853478, "data": { "object": { "num_of_errors": 123, "fail_count": 3 }}}

最佳答案

如果

  • Content-Type: application/json
  • 如果 POST 主体没有紧密绑定(bind)到 Controller 的输入对象类

然后 MVC 并没有真正将 POST 主体绑定(bind)到任何特定的类。您也不能只获取 POST 正文作为 ActionResult 的参数(在另一个答案中建议)。很公平。您需要自己从请求流中获取并处理它。

[HttpPost]
public ActionResult Index(int? id)
{
Stream req = Request.InputStream;
req.Seek(0, System.IO.SeekOrigin.Begin);
string json = new StreamReader(req).ReadToEnd();

InputClass input = null;
try
{
// assuming JSON.net/Newtonsoft library from http://json.codeplex.com/
input = JsonConvert.DeserializeObject<InputClass>(json)
}

catch (Exception ex)
{
// Try and handle malformed POST body
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}

//do stuff

}

更新:

对于 Asp.Net Core,对于复杂的 JSON 数据类型,您必须在 Controller 操作中的参数名称旁边添加 [FromBody] 属性:

[HttpPost]
public ActionResult JsonAction([FromBody]Customer c)

另外,如果你想以字符串的形式访问请求体来自己解析它,你应该使用 Request.Body 而不是 Request.InputStream:

Stream req = Request.Body;
req.Seek(0, System.IO.SeekOrigin.Begin);
string json = new StreamReader(req).ReadToEnd();

关于asp.net-mvc - MVC Controller : get JSON object from HTTP body?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13041808/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com