2017-01-05 16 views
0

私は、アプリケーションから作成したレポートを作成して読むための快適なWeb​​サービスを設計しています。レポートを作成するときに、名前、電話番号、メールなどのプライバシー情報を追加することが可能です。レポートを作成した後、同じWebサービスを通じて公開されます。快適なWeb​​サービス、部分的な読み取り権限

POST /report 
{ 
"name":"test", 
"email":"[email protected]", 
"report_contents":.... 
} 

リターンでOK 200:

{ 
"id":1, 
"report_contents":.... 
} 

と方法とを取得するレポート: GET /レポート/ {REPORT_ID}

私は管理者が管理することが可能な他のアプリを持っています以前のWebサービスを通じて作成されたレポート。このアプリケーションでは、プライバシーに関する機密情報を表示したいと考えています。特定のレポートを取得するために、次のURLを使用します。

{ 
"id":1, 
"name":"test", 
"email":"[email protected]", 
"report_contents":.... 
} 

今すぐ問題がある:200 OKを返す

GET /report/{report_id} 

。これはまったく同じURLです。両方の呼び出しに同じWebサービスを使用することは可能ですか、従来の、あるいは良い考えですか?しかし、CRUD管理をしていますか?ユーザーの役割によって情報の一部が表示/ブロックされません。それとも、制限付きの別のWebサービスを作る方がよいでしょうか?

答えて

1

を持ってはい、それは異なる要求に対して同じURLで返される同じリソースの異なる表現のためにOKです。それがコンテンツ交渉の仕組みです。

あなたはこのことについて懸念している場合は、私は2つのオプションを考えることができます:

1つのオプションは、明示的なビューの選択をするクエリパラメータを含めることで、アクセスがそれぞれに制御することができます。例えば。

  • /report/{report_id}?view=full
  • /report/{report_id}?view=restricted

またはあなたはまた、二つのサブリソース、/report/{report_id}/fullと呼ばれる1と/report/{report_id}/restrictedと呼ばれるものを考えることができ、ユーザーが持っていないとき、あなたは40倍のコードを返すことができます。彼らが見ることができる場所のヒントとしてLocationヘッダーで、正しいアクセス許可。

+0

あなたが言うことはかなり意味があります。 APIキーやOauth2を使ってAPIを保護することを忘れていました。その役割に基づいて、私は彼らが見ることが許可されているものを返すでしょう。 – Terabyte

+0

返されるモデルを定義するときにあいまい性が問題になることはありませんか? – Terabyte

+0

あいまいさどこ?RESTクライアントは、異なる表現を受け取ることができなければなりません。 – Joe

1

ご使用の言語でサポートされている場合は、動的オブジェクトを返すことができます。

ここにいくつかの疑似コードがあります。

if (loggedInUser != isAdmin(user)) 
    return new { id: 1, contents: "..." } 
else 
    return new { id: 1, name: "test", email: "[email protected]", contents: "..." } 

個人的には、私はさまざまなことをする異なる領域を持っています。全員のためにモデルを取得する1つの領域。もう一つは管理者のようなものです。 1つのエリアで

、あなたは

関連する問題