練習 - 實作 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] 屬性表示的 HTTP POST 動詞。
  • 將要求本文的 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 傳回型別都是未知。 BadRequestNotFoundNoContent 方法分別會傳回 BadRequestResultNotFoundResultNoContentResult 類型。

注意

因為控制器將以 [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] 屬性表示的 HTTP DELETE 動詞。
  • 需要將 id 參數的值加入 URL 的 pizza/ 後方。
  • 會傳回 IActionResult,因為在執行階段之前,ActionResult 傳回型別都是未知。 NotFoundNoContent 方法分別會傳回 NotFoundResultNoContentResult 型別。
  • 查詢記憶體內部快取,以找出符合 id 參數的披薩。

請記得先儲存 Controllers/PizzaController.cs 檔案再繼續,

建置並執行完成的 Web API

執行下列命令來建立並啟動 Web API:

dotnet run

使用 HTTP 檔案測試已完成的 Web API

  1. 重新開啟 ContosoPizza.http 檔案。

  2. 使用下列命令來提出 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
    }
    
  3. 使用下列命令,以 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
    }
    
  4. 如果您執行下列命令,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

  1. 從主功能表選取 [終端機] > [新增終端機],藉此從 Visual Studio Code 重新開啟現有的 httprepl 終端機或開啟新的整合式終端機。

  2. 如果您開啟了新終端機,請執行下列命令以連線到 Web API:

    httprepl https://localhost:{PORT}
    

    或者,也可以在 HttpRepl 執行期間的任何時候執行下列命令:

    connect https://localhost:{PORT}
    
  3. 執行下列命令,以前往 Pizza 端點:

    cd Pizza
    
  4. 執行下列命令,以查看 Pizza API 的新動作:

    ls
    

    上述命令會顯示 Pizza 端點的可用 API 輸出:

        https://localhost:{PORT}/Pizza> ls
        .      [GET|POST]
        ..     []
        {id}   [GET|PUT|DELETE]
    
  5. 使用下列命令來提出 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
    }
    
  6. 使用下列命令,以 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
    }
    
  7. 如果您執行下列命令,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。