FromBody字符串参数给出null

Rob*_*ine 30 c# asp.net-web-api asp.net-web-api-routing asp.net-web-api2 postman

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

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

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

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

PostMan目前设置如下:

POST http://localhost:8000/Edit/Test?id=111
key = id  value = 111
Body - x-www-form-urlencoded
key = jsonString  value = "=test"
Run Code Online (Sandbox Code Playgroud)

Nko*_*osi 42

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

使用[FromBody]

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

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

在此示例中,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"
Run Code Online (Sandbox Code Playgroud)

当参数具有[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
Run Code Online (Sandbox Code Playgroud)


Ral*_*ing 39

通过声明jsonString参数,[FromBody]告诉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....
}
Run Code Online (Sandbox Code Playgroud)

和发送的JSON一样

{
    key: "value"
}
Run Code Online (Sandbox Code Playgroud)

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

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

  • @Fabio-然后[FromBody]将不起作用,因为它告诉框架您要将数据绑定到模型类。为了避免绑定,请跳过此参数并直接访问发送的数据,如上一段所述。希望对您有所帮助。 (2认同)
  • 如果它只是一个字符串,那么您不需要创建模型 - 您只需要传递一个 JSON 字符串,该字符串用双引号括起来,即“test”而不仅仅是 test。 (2认同)

MiF*_*vil 16

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

"test"
Run Code Online (Sandbox Code Playgroud)

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

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

 


Eug*_*yeu 11

就我而言,我忘记使用

JSON.stringify(bodyStuff).
Run Code Online (Sandbox Code Playgroud)


Som*_*boy 8

我知道这个答案有点旧,并且有一些非常好的答案已经解决了问题。为了扩大这个问题,我想再提一件在过去的 4 或 5 个小时里让我发疯的事情。

这是非常非常非常,你在你的模型类属性有重要的enabled属性。

不起作用(参数仍然为空):

/* 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;}
}
Run Code Online (Sandbox Code Playgroud)

工作:

/* 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;}
}
Run Code Online (Sandbox Code Playgroud)


Igo*_*gor 6

你走在正确的轨道上.

在标题集上

Content-Type: application/x-www-form-urlencoded
Run Code Online (Sandbox Code Playgroud)

POST请求的正文应该是=test没有别的.对于未知/变量字符串,您必须对值进行URL编码,以便您不会意外地使用输入字符进行转义.


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


Der*_*ade 6

如果您不想/不需要绑定到具体的类,您可以将 JSON 直接传递到 WebAPI 控制器。控制器能够使用ExpandoObject类型接受 JSON。这是方法示例:

public void Post([FromBody]ExpandoObject json)
{
    var keyValuePairs = ((System.Collections.Generic.IDictionary<string, object>)json);
}
Run Code Online (Sandbox Code Playgroud)

将Content-Type标头设置为application/json并将 JSON 作为正文发送。keyValuePairs对象将包含 JSON 键/值对。

或者,您可以让该方法接受传入的 JSON 作为JObject类型(来自 Newtonsoft JSON 库),并通过将其设置为动态类型,您可以通过点表示法访问属性。

public void Post([FromBody]JObject _json)
{
    dynamic json = _json;
}
Run Code Online (Sandbox Code Playgroud)


Man*_*ddy 5

经过 1 小时的斗争,终于让它工作了。

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

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

邮递员(看起来完全一样,如下所示):

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

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

值控制器.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<Dictionary<string, dynamic>>(jsonString);

    // value1 is myJsonObj[key1]
    var valueOfkey1 = myJsonObj["key1"];

    return myJsonObj;
}
Run Code Online (Sandbox Code Playgroud)

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


Moh*_*erm 5

使用原始 JSON 发布字符串,不要忘记双引号!

在此处输入图片说明