Передача точных параметров в веб-API в ASP. NET Core - PullRequest
0 голосов
/ 05 мая 2020

Я написал веб-API в ASP. NET Core, для которого мне нужно передать 2 параметра; один из них представляет собой строку с оценкой, другой - список типов studentInfo, как показано здесь:

[HttpPost]
[Route("UpdateActiveStudents")]
public Response UpdateActiveStudents(string grade, [FromBody] List<StudentsInfo> lststudents)
{
        try
        {
            // My Logic
        }
        catch(Exception ex)
        {
            resp.flag = false;
            resp.message = ex.Message;
        }

        return resp;
}

Для тестирования этого API я использовал AR C (Advanced Rest Client). Я передал данные в запросе POST следующим образом:

{
    "grade": "B",
    "lststudents": [
                       { "StudentName": "abcdef", "RollNo": "user1"}, 
                       { "StudentName": "abcdef", "RollNo": "user1"}
                   ]
}

Это вызывает ошибку состояния HTTP 400 со следующим сообщением:

Невозможно десериализовать текущий JSON объект (например, {"name": "value"}) в тип 'System.Collections.Generi c .List`1 [SchoolHub.Model.StudentList]', потому что для этого типа требуется массив JSON (например, [1 , 2,3]) для правильной десериализации. Чтобы исправить эту ошибку, либо измените JSON на массив JSON (например, [1,2,3]), либо измените десериализованный тип так, чтобы он был нормальным. NET типом (например, не примитивным типом, таким как целое число , а не тип коллекции, такой как массив или список), который можно десериализовать из объекта JSON. JsonObjectAttribute также можно добавить к типу, чтобы заставить его десериализоваться из объекта JSON. Путь 'lstudents', строка 2, позиция 13.

Мне не известно об этом исключении.

Ответы [ 2 ]

0 голосов
/ 05 мая 2020

Эта проблема возникает из-за того, что вы отправляете данные не в формате, ожидаемом ASP. Net Web API. ASP. net Веб-API требует некоторого специального формата при работе с такими значениями, как строка и параметр типа значения (int, bool, et c), отмеченные атрибутом FromBody.

Просто удалите FromBody будет работать. Для лучшего понимания go по этой ссылке.

Почему мы должны указывать FromBody и FromUri?

0 голосов
/ 05 мая 2020

В веб-API общие правила привязки параметров для метода POST следующие:

Query string -> Primitive type
Request body -> Complex type

Теперь, если вы хотите использовать метод POST со смешанными параметрами, т.е. в вашем случае вы передаете примитив (строку) и сложный (Список), веб-API получит параметр оценка из строки запроса и студент параметр из тела запроса .

Возможные решения -

  1. В запросе AR C кажется, что вы передаете оценку в теле запроса, а не в качестве параметра строки запроса. Попробуйте передать оценку в качестве параметра строки запроса.
  2. Также добавьте класс, т.е. StudentInfoRequest, чтобы обернуть List<StudentsInfo> lststudents, а затем использовать объект StudentInfoRequest для передачи в качестве параметра методу UpdateActiveStudents.
  3. Вам не нужно упоминать [FromBody] в методе UpdateActiveStudents, поскольку по умолчанию сложные параметры читать из тела запроса с помощью веб-API.

Надеюсь, это поможет!

...