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