Сообщение от тела всегда пусто

У меня есть новый API, который я создаю с помощью ASP.NET Core, и я не могу получить данные, отправленные POST до конечной точки.

Вот как выглядит конечная точка:

[HttpPost]
[Route("StudentResults")]
public async Task<IActionResult> GetStudentResults([FromBody]List<string> userSocs, [FromBody]int collegeId)
{
    var college = await _collegeService.GetCollegeByID(collegeId);
    // var occupations = await _laborMarketService.GetOccupationProgramsBySocsAndCollege(userSocs, college);
    return Ok();
}

И вот как выглядит моя полезная нагрузка, которую я посылаю через Postman:

{
    "userSocs": [
            "291123",
            "291171",
            "312021",
            "291071",
            "152031",
            "533011"
        ],
    "collegeId": 1
}

Я проверяю, что почтальон установлен как POST с приложением Content-Type application/json. Что я делаю неправильно?

Ответ 1

Вы всегда получаете null, потому что вам нужно инкапсулировать все ваши переменные сообщения только в одном объекте. Вот так:

public class MyPostModel {
    public List<string> userSocs {get; set;}
    public int collegeId {get; set;}
}

а затем

public async Task<IActionResult> GetStudentResults([FromBody] MyPostModel postModel)

Ответ 2

Если модель пуста, проверьте:

1) Куда отправляются данные: тело, форма? и на основе этого добавить декоратор к действию. Например:

[HttpPost]
public JsonResult SaveX([FromBody]MyVM vm) { ... }

2) Проверьте ModelState: если он недействителен, vm не будет связан, поэтому он будет нулевым.

if (ModelState.IsValid) { ... }

Ответ 3

Я знаю, что это не имеет отношения к вашему делу, но я публикую здесь свой ответ. Это глупая ошибка, которую я сделал в своем коде. Я только что скопировал один из моих запросов Get и изменил его на запрос Post, и забыл украсить параметр с помощью [FromBody]. Если у кого-то еще есть такая же проблема, пожалуйста, убедитесь, что вы [FromBody] параметр с помощью [FromBody].

[HttpPost]
public IApiResponse Update([FromBody] User user) {
 if (user == null) return new ApiBadRequestResponse(ModelState);
 return _userService.Post(user) ? new ApiOkResponse(user) : new ApiResponse(500);
}

Ответ 4

Если вы хотите отправить две или более моделей, вы должны использовать этот пример, это работает для меня, удачи

    [HttpPost]
    public async Task<ActionResult> addUsuario([FromBody] Newtonsoft.Json.Linq.JObject datos)
    {
        Usuarios user = datos["usuario"].ToObject<Usuarios>();
        Empresas empresa = datos["empresa"].ToObject<Empresas>();
       return  Json(await _srv.addUsuario(user, empresa));
    }

Ответ 5

JSON.stringify(...) решил мои проблемы