C# 具有多个字符串类型参数的HttpPost。为什么两个参数都为空?
我有一个API控制器,如下所示:C# 具有多个字符串类型参数的HttpPost。为什么两个参数都为空?,c#,asp.net-core,http-post,asp.net-core-webapi,asp.net-core-3.0,C#,Asp.net Core,Http Post,Asp.net Core Webapi,Asp.net Core 3.0,我有一个API控制器,如下所示: [ApiController] [Route("test")] public class TestController : ControllerBase { [HttpPost] public IActionResult PostData(string param1, string param2) { if (string.IsNullOrEmpty(param1) || string.IsNullOrEmpty(para
[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 );
}
}
当我试图从postman访问它时,在编写post请求时,我在json正文中使用以下内容
{
"param1" : "abc",
"param2": "def"
}
但是,这会导致错误的请求。如果我在PostData方法上添加一个断点,它将到达第一行,在那里我对null或空字符串进行检查,并且两个参数都为null。这让我觉得我没有在客户端正确构建json。有人能指出我可能做错了什么吗?这是我的方法
[Route("api/[controller]")]
[ApiController]
public class HomeController : ControllerBase
{
....
[HttpPost("[action]")]
public string GetStudentData_1(string p1, string p2)
{
return p1 + p2;
}
}
我就是这么叫它的
第二种方法是传递有效的Json。将控制器方法更改为:
[HttpPost("[action]")]
public string GetStudentData_1([FromBody]JObject data)
{
return data["p1"].ToString() + data["p2"].ToString() ;
}
确保JSON有效,并在Body/Raw中选择JSON application/JSON:
数据[p1]和数据[p2]允许您访问参数。为JObject和
尝试改用FormCollection
试试这个[FromBody]
如果使用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;
}
3.控制员:
[HttpPost]
public string PostData([FromBody]JObject data)
{
return data["param1"].ToString() + data["param2"].ToString();
}
1.使用application/x-www-form-urlencoded:param1=abc¶m2=def 2。或者创建一个DTO类公共类DTO{public string Param1{get;set;}public string Param2{get;set;}}}并将方法更改为PostDataDto payloadI我不想使用DTO类,而更喜欢使用json。这在约束条件下是可能的吗?如果只有一个参数,这是可能的。但是,它不适用于您的场景:JSON需要在绑定参数之前反序列化HTTP正文如果您使用javascript发布JSON数据,您可能需要JSON.StringifyJSONObject您现在解决了问题了吗?如果我的答案对您有帮助,您可以回答我的问题吗?我不喜欢通过查询参数传递它。是否可以将其更改为在正文中传递参数?@BKS-使用Raw。这就是我正在使用的,并导致两个参数在正文中都为nullAPI@BKS-你试过第二种方法吗?
public IActionResult PostData([FromBody]string param1, [FromBody]string param2)
[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;
}
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers()
.AddNewtonsoftJson();
}
[HttpPost]
public string PostData([FromBody]JObject data)
{
return data["param1"].ToString() + data["param2"].ToString();
}