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

  1. Откройте файл ContosoPizza.http.

  2. Выполните запрос 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
    }
    
  3. Измените созданную пиццу 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
    }
    
  4. Наш 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 командной строки

  1. Снова откройте существующий терминал httprepl или откройте новый встроенный терминал из Visual Studio Code, выбрав в главном меню пункт Терминал>Новый терминал.

  2. Если вы открыли новый терминал, подключитесь к веб-API, выполнив следующую команду:

    httprepl https://localhost:{PORT}
    

    Также можно выполнить следующую команду в любое время, пока выполняется HttpRepl:

    connect https://localhost:{PORT}
    
  3. Перейдите к конечной точке Pizza, выполнив следующую команду:

    cd Pizza
    
  4. Выполните следующую команду, чтобы просмотреть новые действия в API пиццы:

    ls
    

    Предыдущая команда отображает выходные данные со списком доступных API для конечной точки Pizza:

        https://localhost:{PORT}/Pizza> ls
        .      [GET|POST]
        ..     []
        {id}   [GET|PUT|DELETE]
    
  5. Выполните запрос 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
    }
    
  6. Измените созданную пиццу 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
    }
    
  7. Наш 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.