FromBody字符串参数给出null

这可能是非常基本的东西,但我无法弄清楚我哪里出错了。

我试图从POST的主体中获取一个字符串,但“jsonString”只显示为null。 我也想避免使用模型,但也许这是不可能的。 我用PostMan打的那段代码是这个块:

[Route("Edit/Test")] [HttpPost] public void Test(int id, [FromBody] string jsonString) { ... } 

也许这是我对邮递员做错的事情,但我一直试图在身体的价值部分使用“= test”(如在关于这个主题的其他问题中看到的那样) – x-www-form-urlencoded section with密钥作为jsonString而没有。 我也尝试过使用raw-text和raw-text / plain。 我得到了身份证,所以我知道url是正确的。 任何有关这方面的帮助将不胜感激。

PostMan目前设置如下:

 POST http://localhost:8000/Edit/Test?id=111 key = id value = 111 Body - x-www-form-urlencoded key = jsonString value = "=test" 

通过使用[FromBody]声明jsonString参数,您可以告诉ASP.NET Core使用输入格式化程序将提供的JSON(或XML)绑定到模型。 因此,如果您提供简单的模型类,那么您的测试应该可行

 public class MyModel { public string Key {get; set;} } [Route("Edit/Test")] [HttpPost] public void Test(int id, [FromBody] MyModel model) { ... model.Key.... } 

和发送的JSON一样

 { key: "value" } 

当然,您可以通过访问控制器中的HttpContext.Request来跳过模型绑定并直接检索提供的数据。 HttpContext.Request.Body属性为您提供内容流,或者您可以通过HttpContext.Request.Forms访问表单数据。

由于类型安全,我个人更喜欢模型绑定。

在ASP.NET Web API中引用参数绑定

使用[FromBody]

要强制Web API从请求正文中读取简单类型,请将[FromBody]属性添加到参数中:

 [Route("Edit/Test")] [HttpPost] public IHttpActionResult Test(int id, [FromBody] string jsonString) { ... } 

在此示例中,Web API将使用媒体类型格式化程序从请求正文中读取jsonString的值。 这是一个示例客户端请求。

 POST http://localhost:8000/Edit/Test?id=111 HTTP/1.1 User-Agent: Fiddler Host: localhost:8000 Content-Type: application/json Content-Length: 6 "test" 

当参数具有[FromBody]时,Web API使用Content-Type标头选择格式化程序。 在此示例中,内容类型为“application / json”,请求正文是原始JSON字符串(不是JSON对象)。

在上面的示例中,如果在正文中以正确的格式提供数据,则不需要模型。

对于URL编码,请求将如下所示

 POST http://localhost:8000/Edit/Test?id=111 HTTP/1.1 User-Agent: Fiddler Host: localhost:8000 Content-Type: application/x-www-form-urlencoded Content-Length: 5 =test 

当具有[FromBody]属性时,发送的字符串不应该是原始字符串,而是JSON字符串,因为它包含包装引号:

 "test" 

基于https://weblog.west-wind.com/posts/2017/Sep/14/Accepting-Raw-Request-Body-Content-in-ASPNET-Core-API-Controllers

在asp.net web api中使用FromBody时,类似的答案字符串值为空

你走在正确的轨道上。

在标题集上

 Content-Type: application/x-www-form-urlencoded 

POST请求的主体应该是=test而不是其他内容。 对于未知/变量字符串,您必须对值进行URL编码,以便您不会意外地使用输入字符进行转义。


另请参见ASP.NET Web Api应用程序的POST字符串 – 返回null

在我的情况下,我忘了使用JSON.stringify(bodyStuff)。

我知道这个答案有点陈旧,并且有一些非常好的答案已经解决了问题。

为了扩大这个问题,我想提一下让我在过去4或5个小时内疯狂的事情。

模型类中的属性启用了set属性非常非常重要。

无效(参数仍为null):

 /* Action code */ [HttpPost] public Weird NOURLAuthenticate([FromBody] Weird form) { return form; } /* Model class code */ public class Weird { public string UserId {get;} public string UserPwd {get;} } 

工作:

 /* Action code */ [HttpPost] public Weird NOURLAuthenticate([FromBody] Weird form) { return form; } /* Model class code */ public class Weird { public string UserId {get; set;} public string UserPwd {get; set;} } 

终于在经过1小时的斗争后才开始工作。

这将删除null问题,也以通用方式获取JSON key1value1值 (无模型绑定) ,.

对于新的WebApi 2应用程序示例:

邮差(看起来完全如下):

 POST http://localhost:61402/api/values [Send] Body (*) raw JSON (application/json) v "{ \"key1\": \"value1\" }" 

上面的端口61402或url / api /值可能与您不同。

ValuesController.cs

 using Newtonsoft.Json; // .. // POST api/values [HttpPost] public object Post([FromBody]string jsonString) { // add reference to Newtonsoft.Json // using Newtonsoft.Json; // jsonString to myJsonObj var myJsonObj = JsonConvert.DeserializeObject>(jsonString); // value1 is myJsonObj[key1] var valueOfkey1 = myJsonObj["key1"]; return myJsonObj; } 

现在一切都很好,不确定如果我有子键,是否需要模型绑定到类,或者,子键上的DeserializeObject可能会起作用。