33

私は現在APIを設計していますが、ちょっとした問題が発生 しました。IDまたはスラッグのいずれかでアイテムを識別できるようにする必要がある場合、RESTful APIのURLはどのように見える必要がありますか?

私は3つのオプションを考えることができました:

GET /items/<id>
GET /items/<slug>

これには、スラッグとIDが区別可能である必要がありますが、この場合は必ずしも指定されていません。あなたがこのようなことをすることを除いて、私はこの問題のきれいな解決策を考えることができません:

GET /items/id/<id>
GET /items/slug/<slug>

これは問題なく機能しますが、スラッグまたはIDのいずれかでアイテムを識別したいのはこれだけではありません。他のアクションに同じアプローチを実装したい場合は、すぐに非常に醜くなります。それはあまり拡張可能ではないため、このアプローチにつながります。

GET /items?id=<id>
GET /items?slug=<slug>

これは良い解決策のようですが、それが期待されるものであるかどうかはわかりません。したがって、誤った使用によるイライラするエラーにつながる可能性があります。また、このルーティングを実装するのはそれほど簡単ではありません。ただし、簡単に拡張でき、複数のアイテムを取得する方法と非常によく似ています。

GET /items?ids=<id:1>,<id:2>,<id:3>
GET /items?slugs=<slug:1>,<slug:2>,<slug:3>

しかし、これには欠点もあります。誰かが取得したいアイテムの一部をIDで識別したいが、他のアイテムをスラッグで識別したい場合はどうなるでしょうか。これらの識別子を混在させることは、これで簡単に実現することはできません。

これらの問題に対して最も広く受け入れられている最善の解決策は何ですか?一般に、そのようなAPIを設計する際に重要なことは何ですか?

4

1 に答える 1

16

私が3番目のオプションを好む3つのうち、その構文を見るのは珍しいことではありません。たとえば、TwitterのAPIの一部では、その構文が許可されています: https ://dev.twitter.com/rest/reference/get/statuses/show/id

4番目のオプションはハイブリッドアプローチです。このアプローチでは、単一アイテムの一般的なアクセス方法として1つ(たとえばID)を選択しますが、スラッグに基づくクエリも許可します。例えば:

GET /items/<id>
GET /items?slug=<slug>
GET /items?id=<id>

ルーティングにより、/ items /idが/items?id=にマップされます。

複数のID/スラッグに拡張可能ですが、URIを基になるデータモデルに一致させるというRESTパラダイムを満たしています。

于 2012-04-04T19:55:29.240 に答える