【问题标题】:HttpPost with multiple string type parameters. Why both parameters are null?具有多个字符串类型参数的 HttpPost。为什么两个参数都为空?
【发布时间】:2019-11-07 04:08:01
【问题描述】:

我有一个 API 控制器如下:

[ApiController]
[Route("test")]
public class TestController : ControllerBase
{
    [HttpPost]
    public IActionResult PostData(string param1, string param2)
    {
        if (string.IsNullOrEmpty(param1) || string.IsNullOrEmpty(param2))
        {
            return BadRequest();
        }

        string result = "result =  " + param1 + "." + param2;
        return new JsonResult(result );
    }
}

当我尝试从邮递员访问它时,我在撰写帖子请求时在 json 正文中使用以下内容。

{
    "param1" : "abc",
    "param2": "def"
}

但是,这会导致 400 Bad Request。如果我在PostData 方法上添加一个断点,它会到达我正在检查空字符串或空字符串并且两个参数都为空的第一行。这让我认为我没有在客户端正确构建 json。有人可以指出我在这里可能做错了什么吗?

【问题讨论】:

  • 1.使用application/x-www-form-urlencoded:param1=abc&param2=def 2.或者创建一个DTO类public class Dto{ public string Param1 {get;set;} public string Param2{get;set;} }并将方法改为PostData(Dto payload)
  • 我不想使用 DTO 类,而是更喜欢坚持使用 json。这可能与约束有关吗?
  • 如果你只有一个参数是可以的。但是,它不适用于您的场景:JSON 需要在绑定参数之前反序列化 HTTP 正文
  • 如果使用javascript发布json数据,可能需要JSON.stringify(jsonObject)
  • 您的问题现在解决了吗?如果我的回答对您有帮助,您能accept我的回答吗?

标签: c# asp.net-core http-post asp.net-core-webapi asp.net-core-3.0


【解决方案1】:

尝试改用FormCollection

[HttpPost] 
public ActionResult PostData(FormCollection collection)
{
    // Get Post Params Here
    string p1 = collection["param1"];
    string p2 = collection["param2"];
}

【讨论】:

    【解决方案2】:

    这是我的方法

    [Route("api/[controller]")]
    [ApiController]
    public class HomeController : ControllerBase
    {
    ....
        [HttpPost("[action]")]
        public string GetStudentData_1(string p1, string p2)
        {
            return p1 + p2;
        }
    }
    

    我是这样称呼它的

    第二种方法是传递一个VALID Json。将您的控制器方法更改为:

    [HttpPost("[action]")]
    public string GetStudentData_1([FromBody]JObject data)
    {
        return data["p1"].ToString() + data["p2"].ToString() ;
    }
    

    并确保 JSON 有效,然后在 Body/Raw 中选择 JSON (application/json)

    data["p1"]data["p2"] 让您可以访问参数。为JObject

    引入以下参考
    using Newtonsoft.Json.Linq;
    

    【讨论】:

    • 我不喜欢通过查询参数传递它。是否可以更改它以通过身体传递参数?
    • @BKS - 使用 Raw。
    • 这就是我正在使用的,导致 API 中的两个参数都为空
    • @BKS - 你试过第二种方法了吗?
    【解决方案3】:

    试试这个[FromBody]

    public IActionResult PostData([FromBody]string param1, [FromBody]string param2)
    

    【讨论】:

      【解决方案4】:

      如果你使用asp.net core 3.0,你可以使用JsonElement来接收你的json:

      [HttpPost]
      public string PostData([FromBody]JsonElement data)
      {
          var param = "";
          var json = JsonSerializer.Serialize<dynamic>(data);
          using (JsonDocument doc = JsonDocument.Parse(json))
          {
              JsonElement root = doc.RootElement;
              var param1 = root.GetProperty("param1");
              var param1data = param1.GetString();
              var param2 = root.GetProperty("param2");
              var param2data = param2.GetString();
              param = param1data + param2data;
          }
          return param;
      }
      

      @Sadique的回答也可以很好用。对于asp.net core3.0,在使用代码之前需要做如下操作:

      1.安装Microsoft.AspNetCore.Mvc.NewtonsoftJson包。

      2.在ConfigureServices()添加对AddNewtonsoftJson()的调用:

      public void ConfigureServices(IServiceCollection services)
      {
          services.AddControllers()
                  .AddNewtonsoftJson();
      }
      

      3.控制器:

      [HttpPost]
      public string PostData([FromBody]JObject data)
      {
          return data["param1"].ToString() + data["param2"].ToString();
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-16
        • 1970-01-01
        • 2012-02-08
        • 2018-01-23
        相关资源
        最近更新 更多