연습 - 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의 구현 및 테스트를 완료했습니다.