2012-07-18 8 views
6

我々は2つの部分に分割されたアプリケーションがあります。REST URIテンプレート

  1. 管理 - データが
  2. 公共変更された - データが

Iを読まれますこの機能を提供するREST APIの作成を検討しています。 CRUD操作をどのように表現することができるのかはとても簡単ですが、個々のリソース上の特定の操作(コマンド)についてはわかりません。たとえば、 "Publish"にはProject、 "PublishCommand"は送信します。サーバーのPublishedプロパティをtrueに設定して、サーバー全体にProjectを戻しません。

同様の注記では、RPCタイプのサービスとして分類されることなく、リソースに対するより高度なクエリ操作をどのように表現すべきかについて少し混乱します。

私のProjectリソースのURIテンプレートを以下に示します。本当にRESTfulなAPIを作成するための正しい道はありますか?

ADMIN API 
--------- 

// Project Resources 
GET /projects -- get all projects 
POST /projects -- create a new project 

// Project Resource 
GET /projects/10 -- get project with id 10 
PUT /projects/10 -- update project with id 10 
DELETE /projects/10 -- delete project with id 10 

// Project Resource Operations 
POST: /projects/10/publish -- publish project with id 10 
POST: /projects/10/unpublish -- unpublish project with id 10 
POST: /projects/10/setposition/2 -- move to position 2 in projects list 

// Project Sub resources (identity is local to project) 
POST: /projects/10/media -- adds media to project with id 10 
PUT: /projects/10/media/5 -- updates media id 5 for project id 10 
DELETE: /projects/10/media/5 -- deletes media id 5 from project id 10 

PUBLIC API 
---------- 

GET: /projects -- gets all projects (with default limit e.g. first 10) 
GET: /projects?skip=10&take=10 -- gets projects 11 to 20 
GET: /projects/tagged/rest OR /taggedprojects/rest -- gets projects tagged with "REST" 
GET: /projects?orderbydesc=publishdate OR /latestprojects -- gets latest projects 

GET: /projects/10 -- gets project with id 10 

答えて

5

RESTはCRUD操作のみを表すことを意図していないと思います。あなたのインターフェースは私にとってはうまく見えますが、あなたは正しい道にいると信じています。

Vaughn VernonのDDDとRESTについては、RESTful SOA or Domain-Driven Design - A Compromise?というオンラインのトークがあります。

あなたはヨールは、GETを使用してモデルを読んで問い合わせることができます:

更新は、私は以下の作られたコメントを含めます。ドメインを変更するには、コマンドを表すリソースにPUTまたはPOSTを実行します。これは、CRUDを超えたドメインモデルの豊かさを提供し、依然としてHTTPの固有のセマンティクスを使用します。

+0

これを見るでしょう。しかし、動作を伝えるためにHTTP動詞を使用することは、RESTの一部であることを忘れないでください。http://martinfowler.com/articles/richardsonMaturityModel.html – Aliostad

+0

ありがとうDennis。これは私の心配です。私はドメインモデルの豊かさを妥協する必要はないので、話すためのRESTfulなAPIを提供することができます。 –

+0

コマンドを表すリソースに対して、GET、PUTまたはPOSTを使用してyorクエリーをリクエストできます。これは、CRUDを超えたドメインモデルの豊かさを提供し、依然としてHTTPの固有のセマンティクスを使用します。しかし、私はいくつかの人々がこの意見を共有していないことを知っています。 –

2

あなたがリソースとして出版を見れば、あなたはCRUD(POST/GET/PUT/DELETE)を使用することができます。公開を作成する

  • POSTを、
  • プロジェクトIDを渡すDELETEこのプロセスは、レコードの物理的な作成に関連する必要があることを意味するものではありません

を取得するための

  • GETを非公開にしますデータベース。重要なのはのリソースベースのアプローチです。

  • +0

    ですので、/ publishedprojectsにPOSTしますか? 「Move」コマンドのように、実際にリソースに全くマッピングしない操作についてはどうでしょうか。 –

    +0

    RESTを完全に遵守している場合は、まだそれをリソースとして考える必要があります。 http://martinfowler.com/articles/richardsonMaturityModel.html – Aliostad

    +1

    一部の操作がリソースにマップされないため(「移動」の例のように)、ドメイン内で発生するすべての操作に対してこれがどのように可能であるかわかりません。 –

    関連する問題