Я пытаюсь написать запрос POST к моему API, чтобы он мог работать с двумя отдельными объектами (вставка и обновление) - PullRequest
1 голос
/ 11 ноября 2019

Я пытаюсь написать этот контроллер, который принимает запрос POST.

Мне нужен этот контроллер, чтобы добавить новую книгу, а также добавить эти bookId новых книг в другой объект, называемый StoreList.

Поэтому я пытаюсь передать новый bookList и storeListдля этого нужно добавить bookId.

    // POST: api/BookList
    [HttpPost]
    public async Task<ActionResult<BookList>> PostBookList(BookList bookList, StoreList storeList)
    {
        _context.BookList.Add(bookList);
        await _context.SaveChangesAsync();

        _context.Entry(storeList).State = EntityState.Modified;

        try
        {
            await _context.SaveChangesAsync();
        }
        catch (DbUpdateConcurrencyException)
        {
            if (!StoreListExists(storeId))
            {
                return NotFound();
            }
            else
            {
                throw;
            }
        }

        return CreatedAtAction("GetBookList", new { id = bookList.BookId }, bookList);
    }

Вот моя конечная точка API:

https://localhost:44362/api/BookList/

И это два объектаЯ передаю ТЕЛО запроса (новый bookList и существующий storeList):

{
    "bookId": "bc381612-c63b-4438-b35b-161a3a568fc7",
    "bookTitle": "Is this a test 2?"
},
{
    "storeId": "0001f801-6909-4b6e-8652-e1b49745280f",
    "bookId": "bc381612-c63b-4438-b35b-161a3a568fc7"
}

Но всякий раз, когда я пытаюсь «поразить» эту конечную точку, я получаю эту ошибку:

System.InvalidOperationException HResult = 0x80131509 Сообщение = Действие 'DocumentStorageAPI.Controllers.Book.BookListController.PostBookList (DocumentStorageAPI)' имеет более одного параметра, который был указан или выведен как связанный с телом запроса. Только один параметр на действие может быть связан с телом. Проверьте следующие параметры и используйте «FromQueryAttribute» для указания границы из запроса, «FromRouteAttribute» для указания границы из маршрута и «FromBodyAttribute» для параметров, которые должны быть связаны с телом: BookList bookList StoreList storeList

Как я могу заставить свой контроллер позволить мне добавить новый bookList и обновить необходимый storeList?

Спасибо!

1 Ответ

1 голос
/ 11 ноября 2019

Тело запроса должно быть только одним объектом, а метод PostBookList должен иметь только один параметр (с атрибутом [FromBody]). Если вам нужно использовать оба класса в методе, создайте новый класс следующим образом:

public class PostBookListRequest
{
    public BookList BookList { get; set; }
    public StoreList StoreList { get; set; }
}

измените метод PostBookList на

public async Task<ActionResult<BookList>> PostBookList([FromBody]PostBookListRequest request)
{
    // Your logic here
}

И в ТЕЛЕ запроса выполните:

{
    "bookList": {
        "bookId": "bc381612-c63b-4438-b35b-161a3a568fc7",
        "bookTitle": "Is this a test 2?"
    },
    "storeList": {
        "storeId": "0001f801-6909-4b6e-8652-e1b49745280f",
        "bookId": "bc381612-c63b-4438-b35b-161a3a568fc7"
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...