6

ユーザーが自分の写真をアップロードして表示できる Web サイトがあるとします。そのユーザーの単一の写真への RESTful URL は次のようになります。

http://api.gallery.com/users/{user-id}/images/{image-id}

しかし、image-id 自体はすでに一意であるため、この URL で十分取得できます。

http://api.gallery.com/images/{image-id}

REST の観点からは、最初のものは有利ですが、この画像が本当にこのユーザーからのものであることを確認する必要があります。後者の場合、このチェックを追加する必要がないため、処理時間が短縮されます。

そのような場合でもRESTfulであることは好まれますか?

4

3 に答える 3

9

要するに、両方が優先されます。どちらも同じ「もの」を返す可能性がありますが、「コンテキスト」は異なります。

URL を見てみましょう。

  • /users: 全てのユーザー
  • /users/1: ユーザー #1
  • /users/1/images: すべてのユーザー #1 の画像
  • /users/1/images/1: ユーザー #1 の画像 #1

上記の URL はすべて「ユーザー」リソースを中心に展開しています。「すべてのユーザー」、「ユーザー」、「ユーザーの画像」などです。

  • /images: すべての画像
  • /images/1: 画像 #1

上記の URL はすべて「画像」リソースを中心に展開しています。「すべての画像」または「画像」です。

表面的には、その違いは比較的小さいように見えるかもしれませんが、API を構築する場合、その違いはデータの消費方法に大きな影響を与える可能性があります。

たとえば、ユーザー #1 のすべての画像のリストを取得したいとします。どちらが優先されますか?

/users/1/images

また

/images?where=user.id eq 1

最初の形式は私たちが望むものを正確に表しており、より制約があり、理解しやすいですが、クエリ機能が非常に役立つため、2 番目の形式もサポートすべきではないという意味ではありません。

では、関連付けられたユーザーと共に画像のリストを取得したい場合はどうでしょうか?

/users/???

また

/images?include=user

このシナリオでは、ユーザーではなく画像のリストを取得しようとしているため、最初の URL はあまり意味がありませんが、2 番目の URLは必要なものを正確に 表しています。

さて、セキュリティに関しては、理想的には消費者に完全に透過的な方法で行われるべきです. 消費者は「すべての画像が欲しい」と言うことができなければなりません。アクセスできるすべての画像のみを受け取ります。アクセス権のない特定のリソースにアクセスしようとすると、適切な HTTP エラー コードが返されます。

于 2012-02-07T02:58:26.543 に答える
2

あなたが述べた理由から、2番目はよりRESTfulだと思います。URL は階層です。user-id は実際には画像の識別の一部ではないのに、なぜそれを識別子の一部にするのでしょうか?

/images/{image-id} の形式で URL のリストを返す /users/{user-id}/images リソースを作成して、ユーザーがアップロードした画像を一覧表示すると、両方の利点が得られます。

于 2012-02-07T00:17:50.177 に答える
1

それはすべてセマンティクスと意図に依存していると思います。公開されているリソースではなく、保護されたリソースについて話しているようです。この場合、あなたのコミュニケーションはより明確であり、より冗長な形式が使用されたときの驚きが最小限に抑えられます:

http://api.gallery.com/users/{user-id}/images/{image-id}

公開リソースの場合は、image-id のみで識別できるため、短い形式の方がより論理的です。

http://api.gallery.com/images/{image-id}
于 2012-02-07T00:32:22.277 に答える