연습 - CRUD 작업 구현

완료됨

웹 API 컨트롤러를 계속 확장하여 인벤토리에서 피자를 만들고(POST), 업데이트하고(PUT), 삭제하는(DELETE) 기능을 추가해 보겠습니다.

피자 추가

POST 메서드를 사용하여 웹 API를 통해 추가할 피자를 활성화합니다.

Controllers/PizzaController.cs// POST action 주석을 다음 코드로 바꿉니다.

[HttpPost]
public IActionResult Create(Pizza pizza)
{            
    PizzaService.Add(pizza);
    return CreatedAtAction(nameof(Get), new { id = pizza.Id }, pizza);
}

이전 동작:

  • [HttpPost] 특성으로 표시된 대로 HTTP POST 동사에만 응답합니다.
  • 요청 본문의 Pizza 개체를 메모리 내 캐시에 삽입합니다.

참고

컨트롤러에 [ApiController] 특성이 주석으로 지정되어 있기 때문에 Pizza 매개 변수를 요청 본문에서 찾을 수 있음을 암시합니다.

CreatedAtAction 메서드 호출의 첫 번째 매개 변수는 동작 이름을 나타냅니다. 동작 이름을 하드 코딩하지 않기 위해 nameof 키워드가 사용됩니다. CreatedAtAction은 작업 이름을 사용하여 이전 단원에서 설명한 대로 새로 생성된 피자 URL이 포함된 location HTTP 응답 헤더를 생성합니다.

피자 수정

이제, PUT 메서드를 사용하여 웹 API를 통해 업데이트할 피자를 활성화합니다.

Controllers/PizzaController.cs// PUT action 주석을 다음 코드로 바꿉니다.

[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();
}

이전 동작:

  • [HttpPut] 특성으로 표시된 대로 HTTP PUT 동사에만 응답합니다.
  • id 매개 변수의 값이 pizza/ 다음의 URL 세그먼트에 포함되도록 요구합니다.
  • ActionResult 반환 형식이 런타임 시까지 알려지지 않으므로 IActionResult를 반환합니다. BadRequest, NotFoundNoContent 메서드는 각각 BadRequestResult, NotFoundResultNoContentResult 형식을 반환합니다.

참고

컨트롤러에 [ApiController] 특성이 주석으로 지정되어 있기 때문에 Pizza 매개 변수를 요청 본문에서 찾을 수 있음을 암시합니다.

피자 제거

마지막으로, DELETE 메서드를 사용하여 웹 API를 통해 제거할 피자를 활성화합니다.

Controllers/PizzaController.cs// DELETE action 주석을 다음 코드로 바꿉니다.

[HttpDelete("{id}")]
public IActionResult Delete(int id)
{
    var pizza = PizzaService.Get(id);
   
    if (pizza is null)
        return NotFound();
       
    PizzaService.Delete(id);
   
    return NoContent();
}

이전 동작:

  • [HttpDelete] 특성으로 표시된 대로 HTTP DELETE 동사에만 응답합니다.
  • id 매개 변수의 값이 pizza/ 다음의 URL 세그먼트에 포함되도록 요구합니다.
  • ActionResult 반환 형식이 런타임 시까지 알려지지 않으므로 IActionResult를 반환합니다. NotFoundNoContent 메서드는 각각 NotFoundResultNoContentResult 형식을 반환합니다.
  • 메모리 내 캐시에서 제공된 id 매개 변수와 일치하는 피자를 쿼리합니다.

계속하기 전에 Controllers/PizzaController.cs 파일을 저장해야 합니다.

완료된 웹 API 빌드 및 실행

다음 명령을 실행하여 웹 API를 빌드하여 시작합니다.

dotnet run

HTTP 파일을 사용하여 완성된 웹 API 테스트

  1. ContosoPizza.http 파일을 엽니다.

  2. 다음 명령을 사용하여 HttpRepl에서 새 피자를 추가하도록 POST 요청을 합니다.

    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. 다음 명령으로 PUT 요청을 통해 새 Hawaii 피자를 Hawaiian 피자로 업데이트합니다.

    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
        }
    ]
    

이제 ASP.NET Core를 통해 빌드된 새로 만든 웹 API의 구현 및 테스트를 완료했습니다.

선택 사항: 명령줄 HTTPREPL을 사용하여 완성된 웹 API 테스트

  1. 기존 httprepl 터미널을 열거나 주 메뉴에서 터미널>새 터미널을 선택하여 Visual Studio Code에서 새 통합 터미널을 다시 엽니다.

  2. 새 터미널을 연 경우 다음 명령을 실행하여 웹 API에 연결합니다.

    httprepl https://localhost:{PORT}
    

    또는 HttpRepl이 실행 중인 동안 언제든지 다음 명령을 실행합니다.

    connect https://localhost:{PORT}
    
  3. 다음 명령을 실행하여 Pizza 엔드포인트로 이동합니다.

    cd Pizza
    
  4. 다음 명령을 실행하여 피자 API에 대한 새 작업을 확인합니다.

    ls
    

    앞의 명령은 Pizza 엔드포인트에 대해 사용 가능한 API의 출력을 보여줍니다.

        https://localhost:{PORT}/Pizza> ls
        .      [GET|POST]
        ..     []
        {id}   [GET|PUT|DELETE]
    
  5. 다음 명령을 사용하여 HttpRepl에서 새 피자를 추가하도록 POST 요청을 합니다.

    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. 다음 명령으로 PUT 요청을 통해 새 Hawaii 피자를 Hawaiian 피자로 업데이트합니다.

    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
        }
    ]
    

이제 ASP.NET Core를 통해 빌드된 새로 만든 웹 API의 구현 및 테스트를 완료했습니다.