演習 - 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 によってアクション名が使用され、前のユニットで説明したように、新しく作成されたピザへの URL が含まれる location HTTP 応答ヘッダーが生成されます。

ピザを変更する

次に、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 動詞にのみ応答します。
  • URL セグメントの pizza/ の後に、id パラメーターの値が含まれている必要があります。
  • ActionResult の戻り値の型は実行時までわからないため、IActionResult を返します。 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 動詞にのみ応答します。
  • URL セグメントの pizza/ の後に、id パラメーターの値が含まれている必要があります。
  • ActionResult の戻り値の型が実行時までわからないため、IActionResult を返します。 NotFound メソッドと NoContent メソッドは、それぞれ NotFoundResult 型と NoContentResult 型を返します。
  • メモリ内キャッシュで、指定された id パラメーターに一致するピザのクエリを実行します。

続ける前に、忘れずに Controllers/PizzaController.cs ファイルを保存してください。

完成した Web API をビルドして実行する

次のコマンドを実行して、Web API をビルドして開始します。

dotnet run

完成した Web API を HTTP ファイルを使ってテストする

  1. ContosoPizza.http ファイルをもう一度開きます。

  2. 次のコマンドを使用して、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
    }
    
  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 の実装とテストが完了しました。

省略可能:完成した Web API をコマンド ライン HTTPREPL を使ってテストする

  1. 既存の httprepl ターミナルを再度開くか、Visual Studio Code のメイン メニューから [ターミナル]>[新しいターミナル] を選んで新しい統合ターミナルを開きます。

  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. 次のコマンドを使用して、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
    }
    
  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 の実装とテストが完了しました。