2012-04-13 4 views
6

現在、内部REST APIを設計中です。ユーザー(109)は、彼が別のユーザーに送信されたことを示すメッセージを読みたい REST APIの設計 - メールデータのクエリ - どの毒を選択するのですか?

  1. (110)
  2. 読み取り、ユーザー(109)彼のトークンを通じてアプリによく知られている:我々は次のユースケースを持っています彼は(GETリクエストをしながら)認証後に受信した資格情報
  3. 我々は、ユーザ109が私に私のメールを与える」ユーザーの観点から要約する受信機

送信者と110だった。この例では仮定(109)が110に送信しました "

意志

a) GET http://localhost:9099/api/mails/109?receiverUserId=110 
b) GET http://localhost:9099/api/mails?senderUserId=109&receiverUserId=110 
c) GET http://localhost:9099/api/mails?receiverUserId=110 
d) GET http://localhost:9099/api/mails/me/to/110 (when logged in as 109 via token credentials we know that "me" is 109) 
f) GET http://localhost:9099/api/mails/109/to/110 (explicit request, e.g. for admins … has to be guarded against illegal access) 

すべてのリンクが受信機(110)へのリンクのいずれかを送信している「文脈依存」している:3210の

次のURIは、私たちの心に来たが、我々は取るするかを決めることができませんGET要求を実行して異なる結果をもたらします。

私はあなたの意見を知りたいと思っています。

非常に高く評価されています。

歓声同じ URLのためのさまざまなクライアントに

+0

ただの観察:(b)と(d)は同じです。 – ArjunShankar

+0

ああ申し訳ありませんが、あなたは正しいです;-) – Marcel

+1

私はcに投票します。私は知られているように、読書のユーザーを示すことには意味がありません。 (しかし、キャッシュを除いて) – njzk2

答えて

2

異なる応答 マルセルは、大丈夫です。

StackExchangeはそれをしない:

here文書化されて
GET /me/comments/{toid} 

Twitterはあまりにもそれをしない:

here文書化されて
GET /statuses/home_timeline 

これらのURLは両方とも、認証に基づいてログインしたユーザを推測します。はい、それはユーザーがキャッシュを共有するが、IMOの場合は大丈夫です。これがRESTの 'resource identification'制約を破るかどうかは議論の余地があります。 thisの質問に対する回答とそれに続くコメントが私になぜ議論の余地があるのか​​を示しています。

実際には、オプションの中で、あなたは「文脈依存」ではありません言及URLを行い

GET /api/mails?senderUserId=109&receiverUserId=110 

をこの1つは、常に109から110へのメッセージを返します。しかし、あるクライアントがしたいと思う一方、 「送信済み」メッセージを表示するときにこの結果を参照し、もう1つは「受信済み」メッセージを表示するときにこの結果を表示するとします。奇妙な種類のええ?さらに、サーバー上では、認証されたユーザーが109 | 110であることを確認し、それ以外の場合は401 UNAUTHORIZEDを送信する必要があります。

GET /mail/sent 

戻り、すべての送信されたメール:

私のようなものとなるだろう。そして:

GET /mail/sent?to=110 (like applying a 'filter' to /mail/sent) 
OR 
GET /mail/sent/110 (clean URL) 

リターンは110

+0

あなたの答えに感謝します。私は、提出されたリンクの1つを選択すると思います。 – Marcel

1

に送信されたメール "コンテキストセンシティブ" リンクは、(特に、これは、キャッシングを妨げる)REST APIのための悪い考えです。 HTTPだけを使用したい場合はこれでOKです。

現在のユーザーに依存しないURLを使用し、ルールに基づいてアクセスを制限することをお勧めします。

0

私の意見では、あなたが2層必要があります。

一つは、ユーザー認証を必要としない内部層である、それは内部コンポーネントからのみアクセス可能です。これは、この層の利点は、テスト容易性、再利用性とキャッシュ可能である

GET http://localhost:9099/api/mails?senderUserId=109&receiverUserId=110

等のAPIを含みます。

他のレイヤーは外部レイヤーで、ユーザー認証が必要で、外部クライアントからアクセスできます。

GET http://localhost:9099/api/mails?receiverUserId=110などのAPIが含まれています。

クライアントはトークンの資格情報を取得するためにログインする必要があります。サーバーはこのトークンからユーザー情報を取得し、外部API呼び出しを内部API呼び出しにマップできます。

さまざまな種類の認証方法がありますが、内部レイヤーは変更されません。異なる外部レイヤーを内部レイヤーにマップするだけで済みます。

関連する問題