演習 - 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
によってアクション名が使用され、前のユニットで説明したように、新しく作成されたピザへの 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
を返します。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
動詞にのみ応答します。- URL セグメントの
pizza/
の後に、id
パラメーターの値が含まれている必要があります。 ActionResult
の戻り値の型が実行時までわからないため、IActionResult
を返します。NotFound
メソッドとNoContent
メソッドは、それぞれNotFoundResult
型とNoContentResult
型を返します。- メモリ内キャッシュで、指定された
id
パラメーターに一致するピザのクエリを実行します。
続ける前に、忘れずに Controllers/PizzaController.cs ファイルを保存してください。
完成した Web API をビルドして実行する
次のコマンドを実行して、Web API をビルドして開始します。
dotnet run
完成した Web API を HTTP ファイルを使ってテストする
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 で新しく作成した Web API の実装とテストが完了しました。
省略可能:完成した Web API をコマンド ライン HTTPREPL を使ってテストする
既存の
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]
次のコマンドを使用して、
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 で新しく作成した Web API の実装とテストが完了しました。