연습 - 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]
특성으로 표시된 대로 HTTPPOST
동사에만 응답합니다.- 요청 본문의
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
,NotFound
및NoContent
메서드는 각각BadRequestResult
,NotFoundResult
및NoContentResult
형식을 반환합니다.
참고
컨트롤러에 [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]
특성으로 표시된 대로 HTTPDELETE
동사에만 응답합니다.id
매개 변수의 값이pizza/
다음의 URL 세그먼트에 포함되도록 요구합니다.ActionResult
반환 형식이 런타임 시까지 알려지지 않으므로IActionResult
를 반환합니다.NotFound
및NoContent
메서드는 각각NotFoundResult
및NoContentResult
형식을 반환합니다.- 메모리 내 캐시에서 제공된
id
매개 변수와 일치하는 피자를 쿼리합니다.
계속하기 전에 Controllers/PizzaController.cs 파일을 저장해야 합니다.
완료된 웹 API 빌드 및 실행
다음 명령을 실행하여 웹 API를 빌드하여 시작합니다.
dotnet run
HTTP 파일을 사용하여 완성된 웹 API 테스트
ContosoPizza.http 파일을 엽니다.
다음 명령을 사용하여
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 }
다음 명령으로
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 }
또 다음 명령을 실행하면 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]
다음 명령을 사용하여
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 }
다음 명령으로
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 }
또 다음 명령을 실행하면 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의 구현 및 테스트를 완료했습니다.