Упражнение. Реализация операций CRUD
Давайте продолжим расширять возможности нашего контроллера веб-API и добавим возможность создавать (POST), обновлять (PUT) и удалять (DELETE) пиццу из запасов.
Добавление пиццы
Давайте реализуем поддержку добавления сведений о пицце через веб-API с помощью метода POST.
Замените комментарий // POST action в Controllers/PizzaController.cs следующим кодом:
[HttpPost]
public IActionResult Create(Pizza pizza)
{
PizzaService.Add(pizza);
return CreatedAtAction(nameof(Get), new { id = pizza.Id }, pizza);
}
Предыдущее действие:
- Это действие реагирует только на HTTP-команду
POST, как указывает атрибут[HttpPost]. - Вставляет объект
Pizzaиз текста запроса в кэш, расположенный в памяти.
Примечание.
Поскольку контроллер помечен атрибутом [ApiController], подразумевает, что параметр Pizza будет находиться в тексте запроса.
Первый параметр в вызове метода CreatedAtAction представляет имя используемого действия. Ключевое слово nameof используется для предотвращения жесткого задания имени действия.
CreatedAtAction использует имя действия для создания заголовка location HTTP-ответа с URL-адресом только что созданной пиццы, как описано в предыдущем уроке.
Изменение пиццы
Теперь реализуем поддержку обновления сведений о пицце через веб-API с помощью метода PUT.
Замените комментарий // PUT action в Controllers/PizzaController.cs следующим кодом:
[HttpPut("{id}")]
public IActionResult Update(int id, Pizza pizza)
{
if (id != pizza.Id)
return BadRequest();
var existingPizza = PizzaService.Get(id);
if(existingPizza is null)
return NotFound();
PizzaService.Update(pizza);
return NoContent();
}
Предыдущее действие:
- Отвечает только на команду HTTP PUT, обозначенную атрибутом
[HttpPut]. - Необходимо, чтобы значение параметра
idвключалось в сегмент URL-адреса послеpizza/. - Возвращает
IActionResult, так как тип возвращаемого значенияActionResultдо времени выполнения неизвестен. МетодыBadRequest,NotFoundиNoContentвозвращают типыBadRequestResult,NotFoundResultиNoContentResultсоответственно.
Примечание.
Поскольку контроллер помечен атрибутом [ApiController], подразумевает, что параметр Pizza будет находиться в тексте запроса.
Удаление пиццы
Наконец, давайте реализуем поддержку удаления пиццы через веб-API с помощью метода DELETE.
Замените комментарий // DELETE action в Controllers/PizzaController.cs следующим кодом:
[HttpDelete("{id}")]
public IActionResult Delete(int id)
{
var pizza = PizzaService.Get(id);
if (pizza is null)
return NotFound();
PizzaService.Delete(id);
return NoContent();
}
Предыдущее действие:
- Это действие реагирует только на HTTP-команду
DELETE, как указывает атрибут[HttpDelete]. - Необходимо, чтобы значение параметра
idвключалось в сегмент URL-адреса послеpizza/. - Возвращает
IActionResult, так как тип возвращаемого значенияActionResultдо времени выполнения неизвестен. МетодыNotFoundиNoContentвозвращают типыNotFoundResultиNoContentResult, соответственно. - Запрашивает в кэше, расположенном в памяти, пиццу, соответствующую предоставленному параметру
id.
Прежде чем продолжить, не забудьте сохранить файл controllers/PizzaController.cs .
Сборка и запуск готового веб-API
Соберите и запустите веб-API, выполнив следующую команду:
dotnet run
Тестирование готового веб-API с помощью HTTP-файлов
Откройте файл ContosoPizza.http .
Выполните запрос
POSTдля добавление новой пиццы вHttpReplс помощью следующей команды:POST {{ContosoPizza_HostAddress}}/pizza/ Content-Type: application/json { "name": "Hawaii", "isGlutenFree": false } ###Предыдущая команда возвращает только что созданную пиццу:
HTTP/1.1 201 Created Connection: close Content-Type: application/json; charset=utf-8 Date: Wed, 17 Jan 2024 17:03:02 GMT Server: Kestrel Location: http://localhost:5192/Pizza/3 Transfer-Encoding: chunked { "id": 3, "name": "Hawaii", "isGlutenFree": false }Измените созданную пиццу
Hawaiiна пиццуHawaiian, используя запросPUT, с помощью следующей команды:PUT {{ContosoPizza_HostAddress}}/pizza/3 Content-Type: application/json { "id": 3, "name": "Hawaiian", "isGlutenFree": false } ###Предыдущая команда возвращает следующие выходные данные, которые указывают на успешное выполнение:
HTTP/1.1 204 No Content Connection: close Date: Wed, 17 Jan 2024 17:07:30 GMT Server: KestrelЧтобы убедиться, что пицца обновлена, повторно выполните действие
GETс помощью следующей команды:GET {{ContosoPizza_HostAddress}}/pizza/3 Accept: application/json ###Предыдущая команда возвращает только что обновленную пиццу.
HTTP/1.1 200 OK Connection: close Content-Type: application/json; charset=utf-8 Date: Wed, 17 Jan 2024 17:09:01 GMT Server: Kestrel Transfer-Encoding: chunked { "id": 3, "name": "Hawaiian", "isGlutenFree": false }Наш API также может удалить вновь созданную пиццу с помощью действия
DELETE. Для этого выполните следующую команду:DELETE {{ContosoPizza_HostAddress}}/pizza/3 ###Представленная выше команда возвращает
204 No Contentв случае успешного выполнения:HTTP/1.1 204 No Content Date: Fri, 02 Apr 2021 23:30:04 GMT Server: KestrelЧтобы убедиться, что пицца удалена, повторно выполните действие
GETс помощью следующей команды:GET {{ContosoPizza_HostAddress}}/pizza/ Accept: application/json ###Предыдущая команда возвращает в результате исходный список пицц:
HTTP/1.1 200 OK Content-Type: application/json; charset=utf-8 Date: Fri, 02 Apr 2021 23:31:15 GMT Server: Kestrel Transfer-Encoding: chunked [ { "id": 1, "name": "Classic Italian", "isGlutenFree": false }, { "id": 2, "name": "Veggie", "isGlutenFree": true } ]
Теперь вы завершили реализацию и тестирование только что созданного веб-API, созданного с помощью ASP.NET Core.
Необязательно. Тестирование готового веб-API с помощью HTTPREPL командной строки
Откройте существующий
httpreplтерминал или откройте новый интегрированный терминал из Visual Studio Code, выбрав терминал>"Новый терминал " в главном меню.Если вы открыли новый терминал, подключитесь к веб-API, выполнив следующую команду:
httprepl https://localhost:{PORT}Также можно выполнить следующую команду в любое время, пока выполняется
HttpRepl:connect https://localhost:{PORT}Перейдите к конечной точке
Pizza, выполнив следующую команду:cd PizzaВыполните следующую команду, чтобы просмотреть новые действия в API пиццы:
lsПредыдущая команда отображает выходные данные со списком доступных API для конечной точки
Pizza:https://localhost:{PORT}/Pizza> ls . [GET|POST] .. [] {id} [GET|PUT|DELETE]Выполните запрос
POSTдля добавление новой пиццы вHttpReplс помощью следующей команды:post -c "{"name":"Hawaii", "isGlutenFree":false}"Предыдущая команда возвращает только что созданную пиццу:
HTTP/1.1 201 Created Content-Type: application/json; charset=utf-8 Date: Fri, 02 Apr 2021 23:23:09 GMT Location: https://localhost:{PORT}/Pizza?id=3 Server: Kestrel Transfer-Encoding: chunked { "id": 3, "name": "Hawaii", "isGlutenFree": false }Измените созданную пиццу
Hawaiiна пиццуHawaiian, используя запросPUT, с помощью следующей команды:put 3 -c "{"id": 3, "name":"Hawaiian", "isGlutenFree":false}"Предыдущая команда возвращает следующие выходные данные, которые указывают на успешное выполнение:
HTTP/1.1 204 No Content Date: Fri, 02 Apr 2021 23:23:55 GMT Server: KestrelЧтобы убедиться, что пицца обновлена, повторно выполните действие
GETс помощью следующей команды:get 3Предыдущая команда возвращает только что обновленную пиццу.
HTTP/1.1 200 OK Content-Type: application/json; charset=utf-8 Date: Fri, 02 Apr 2021 23:27:37 GMT Server: Kestrel Transfer-Encoding: chunked { "id": 3, "name": "Hawaiian", "isGlutenFree": false }Наш API также может удалить вновь созданную пиццу с помощью действия
DELETE. Для этого выполните следующую команду:delete 3Представленная выше команда возвращает
204 No Contentв случае успешного выполнения:HTTP/1.1 204 No Content Date: Fri, 02 Apr 2021 23:30:04 GMT Server: KestrelЧтобы убедиться, что пицца удалена, повторно выполните действие
GETс помощью следующей команды:getПредыдущая команда возвращает в результате исходный список пицц:
HTTP/1.1 200 OK Content-Type: application/json; charset=utf-8 Date: Fri, 02 Apr 2021 23:31:15 GMT Server: Kestrel Transfer-Encoding: chunked [ { "id": 1, "name": "Classic Italian", "isGlutenFree": false }, { "id": 2, "name": "Veggie", "isGlutenFree": true } ]
Теперь вы завершили реализацию и тестирование только что созданного веб-API, созданного с помощью ASP.NET Core.