Упражнение. Реализация операций 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.