연습 - CRUD 작업 구현
웹 API 컨트롤러를 계속 확장하여 인벤토리에서 피자를 만들고(POST), 업데이트하고(PUT), 삭제하는(DELETE) 기능을 추가해 보겠습니다.
피자 추가
POST 메서드를 사용하여 웹 API를 통해 추가할 피자를 활성화합니다.
// POST action의 Controllers/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 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();
}
이전 동작:
-
[HttpPut]특성으로 표시된 대로 HTTP PUT 동사에만 응답합니다. -
id매개 변수의 값이pizza/다음의 URL 세그먼트에 포함되도록 요구합니다. -
IActionResult반환 형식이 런타임 시까지 알려지지 않으므로ActionResult를 반환합니다.BadRequest,NotFound및NoContent메서드는 각각BadRequestResult,NotFoundResult및NoContentResult형식을 반환합니다.
참고
컨트롤러에 [ApiController] 특성이 주석으로 지정되어 있기 때문에 Pizza 매개 변수를 요청 본문에서 찾을 수 있음을 암시합니다.
피자 제거
마지막으로, DELETE 메서드를 사용하여 웹 API를 통해 제거할 피자를 활성화합니다.
// 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();
}
이전 동작:
-
DELETE특성으로 표시된 대로 HTTP[HttpDelete]동사에만 응답합니다. -
id매개 변수의 값이pizza/다음의 URL 세그먼트에 포함되도록 요구합니다. -
IActionResult반환 형식이 런타임 시까지 알려지지 않으므로ActionResult를 반환합니다.NotFound및NoContent메서드는 각각NotFoundResult및NoContentResult형식을 반환합니다. - 메모리 내 캐시에서 제공된
id매개 변수와 일치하는 피자를 쿼리합니다.
계속하기 전에 Controllers/PizzaController.cs 파일을 저장해야 합니다.
완료된 웹 API 빌드 및 실행
다음 명령을 실행하여 웹 API를 빌드하여 시작합니다.
dotnet run
HTTP 파일을 사용하여 완성된 웹 API 테스트
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 } ]
이제 ASP.NET Core를 통해 빌드된 새로 만든 웹 API의 구현 및 테스트를 완료했습니다.
선택 사항: 명령줄 HTTPREPL을 사용하여 완성된 웹 API 테스트
기존 터미널을
httprepl다시 열거나 주 메뉴에서 터미널 새 터미널을> 선택하여 Visual Studio Code에서새 통합 터미널을 엽니다.새 터미널을 연 경우 다음 명령을 실행하여 웹 API에 연결합니다.
httprepl https://localhost:{PORT}또는
HttpRepl이 실행 중인 동안 언제든지 다음 명령을 실행합니다.connect https://localhost:{PORT}다음 명령을 실행하여
Pizza엔드포인트로 이동합니다.cd Pizza다음 명령을 실행하여 피자 API에 대한 새 작업을 확인합니다.
ls앞의 명령은
Pizza엔드포인트에 대해 사용 가능한 API의 출력을 보여줍니다.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 } ]
이제 ASP.NET Core를 통해 빌드된 새로 만든 웹 API의 구현 및 테스트를 완료했습니다.