연습 - CRUD 작업 구현

완료됨

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

피자 추가

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

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

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

이전 동작:

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

참고

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

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

피자 수정

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

// PUT actionControllers/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();
}

이전 동작:

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

참고

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

피자 제거

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

// DELETE actionControllers/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();
}

이전 동작:

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

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

완료된 웹 API 빌드 및 실행

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

dotnet run

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

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

이제 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. 다음 명령을 사용하여 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
        }
    ]
    

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