HttpPost с несколькими параметрами строкового типа. Почему оба параметра равны нулю? - PullRequest
0 голосов
/ 07 ноября 2019

У меня 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 );
    }
}

Когда я пытаюсь получить к нему доступ от почтальона, при составлении запроса post я использую следующее в теле json.

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

Однако это вызывает 400 неверных запросов. Если я добавлю точку останова в методе PostData, он попадет в первую строку, где я проверяю пустую или пустую строку, и оба параметра равны нулю. Это заставляет меня думать, что я неправильно строю JSON на стороне клиента. Кто-то может указать, что я могу делать здесь не так?

Ответы [ 4 ]

0 голосов
/ 08 ноября 2019

Если вы используете 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.In 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();
}
0 голосов
/ 07 ноября 2019

Попробуйте использовать FormCollection вместо.

[HttpPost] 
public ActionResult PostData(FormCollection collection)
{
    // Get Post Params Here
    string p1 = collection["param1"];
    string p2 = collection["param2"];
}
0 голосов
/ 07 ноября 2019

Попробуйте это [FromBody]

public IActionResult PostData([FromBody]string param1, [FromBody]string param2)
0 голосов
/ 07 ноября 2019

Вот мой метод

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

Вот как я его назвал

enter image description here

Второй путь - это VALID Джсон. Измените метод Controller следующим образом:

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

И убедитесь, что JSON действителен, и выберите JSON (application/json) in в Body / Raw:

enter image description here

data["p1"] и data["p2"] дают вам доступ к параметрам. Введите следующую ссылку для JObject и

using Newtonsoft.Json.Linq;
...