練習 - 實作 CRUD 作業
我們繼續擴充 Web API 控制器來新增功能,藉此在庫存中建立 (POST)、更新 (PUT) 及刪除 (DELETE) 披薩。
新增披薩
我們先使用 POST 方法,透過 Web 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 使用動作名稱來產生 location HTTP 回應標頭,其中包含新建立披薩的 URL,如上一個單元中所述。
修改披薩
接著,使用 PUT 方法,透過 Web 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參數的值加入 URL 的pizza/後方。 - 會傳回
IActionResult,因為在執行階段之前,ActionResult傳回型別都是未知。BadRequest、NotFound與NoContent方法分別會傳回BadRequestResult、NotFoundResult與NoContentResult類型。
注意
因為控制器將以 [ApiController] 屬性標註,所以意指將在要求本文中找到 Pizza 參數。
移除披薩
最後,使用 DELETE 方法,透過 Web 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參數的值加入 URL 的pizza/後方。 - 會傳回
IActionResult,因為在執行階段之前,ActionResult傳回型別都是未知。NotFound與NoContent方法分別會傳回NotFoundResult與NoContentResult型別。 - 查詢記憶體內部快取,以找出符合
id參數的披薩。
請記得先儲存 Controllers/PizzaController.cs 檔案再繼續,
建置並執行完成的 Web API
執行下列命令來建立並啟動 Web API:
dotnet run
使用 HTTP 檔案測試已完成的 Web 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 所建立的新 Web API。
選擇性:使用命令行 HTTPREPL 測試已完成的 Web API
從主功能表選取 [終端機]
httprepl[新增終端機]>,藉此從 Visual Studio Code 重新開啟現有的 終端機或開啟新的整合式終端機。如果您開啟了新終端機,請執行下列命令以連線到 Web API:
httprepl https://localhost:{PORT}或者,也可以在
HttpRepl執行期間的任何時候執行下列命令:connect https://localhost:{PORT}執行下列命令,以前往
Pizza端點:cd Pizza執行下列命令,以查看 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 所建立的新 Web API。