1. ホーム
  2. web-services

[解決済み] RESTfulサービスにおける非CRUD操作

2022-10-13 07:36:45

質問

RESTful サービスに CRUD 以外の操作を追加する方法として、quot;RESTful" とはどのようなものでしょうか。 このようなレコードへの CRUD アクセスを可能にするサービスがあるとします。

GET /api/car/123           <- Returns information for the Car object with ID 123
POST /api/car              <- Creates a new car (with properties in the request)
PUT /api/car/123           <- Updates car 123 (with properties in the request)
DELETE /api/car/123        <- Deletes car 123    
POST /api/car/123/wheel/   <- Creates a wheel and associates it to car 123

車の色を変えたい場合は、単純に POST /api/car/123 で、新しい色のPOST変数を含めます。

しかし、私が車を購入したいとします。その操作は、単に "ユーザー" レコードの "所有車" プロパティを更新するよりも複雑だとします。 次のようなことを単純に行うのはRESTfulでしょうか? POST /api/car/123/purchase ここで、"purchase" は本質的にメソッド名です。 または、次のようなカスタム HTTP 動詞を使用する必要がありますか。 PURCHASE の代わりに POST ?

それとも、CRUD以外の操作は完全にRESTの範囲外なのでしょうか?

どのように解決するのですか?

次のことを考えましょう。 購入 を事業体として、あるいは リソース をRESTful辞書に登録します。つまり、購入を行うことは、実際には新しいリソースを作成することです。だから

POST /api/purchase

は新規注文を行います。このアドレスに送信されるコンテンツの中で、詳細(ユーザー、車など)はid(またはURI)で参照される必要があります。

車の注文がデータベースへの単純なINSERTでないことは問題ではありません。実際、REST は、データベースのテーブルを CRUD 操作として公開することではありません。論理的な観点からは、あなたは注文 (購入) を作成していますが、サーバー側は好きなだけ多くの処理ステップを自由に行うことができます。

HTTPプロトコルをさらに悪用することもできます。使用方法 Location ヘッダを使用して、新しく作成された注文へのリンクを返したり、問題 (サーバ側またはクライアント側) についてユーザに知らせるために HTTP 応答コードを慎重に選択したり、などです。