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