web-dev-qa-db-ja.com

RESTful APIの末尾のスラッシュ

RESTful APIの末尾のスラッシュをどうするかについて私は議論しています。

犬と呼ばれるリソースと、個々の犬の下位リソースがあるとします。したがって、次のことが可能です。

GET/PUT/POST/DELETE http://example.com/dogs
GET/PUT/POST/DELETE http://example.com/dogs/{id}

しかし、次の特別なケースで何をしますか:

GET/PUT/POST/DELETE http://example.com/dogs/

私の個人的な見解では、これはid = nullの個々の犬のリソースにリクエストを送信すると言っています。この場合、APIは404を返すはずです。

他の人は、リクエストが犬のリソースにアクセスしていると言います。つまり、末尾のスラッシュは無視されます。

決定的な答えを知っている人はいますか?

64
Gaz_Edge

これは信頼できるものではありません(RESTには正確な意味がないため)。しかし、RESTの元の論文から、完全な(/で終わっていない)URL名です。リソース、スラッシュ '/'で終わるものはリソースグループです(おそらくそのように記述されていません)。

末尾にスラッシュが付いたURLのGETは、使用可能なリソースをリストすることになっています。

GET http://example.com/dogs/          /* List all the dogs resources */

スラッシュを含むURLのPUTは、すべてのリソースを置き換えることになっています。

PUT http://example.com/dogs/          /* Replace all the dogs resources */

スラッシュを含むURLでのDELETEは、すべてのリソースを削除することになっています

DELETE http://example.com/dogs/       /* Deletes all the dogs resources */

A POSTは、新しいリソースを作成することになっています。その後、アクセスできます。準拠させるために、新しいリソースはこのディレクトリにある必要があります(RESTfulアーキテクチャの多くはここでチートします) 。

POST http://example.com/dogs/        /* Creates a new dogs resource (notice singular) */

等.

この件に関するwikiページはそれをうまく説明しているようです:

https://en.wikipedia.org/wiki/Representational_state_transfer#Applied_to_Web_services を参照してください。

51
Martin York
Does anyone know the definitive answer?

サービスがRESTfulと見なされるために何が必要かについての公式文書がないため、1つはありません。

それは私が単に使いやすさのために末尾のスラッシュを許可すると言った。技術的に言えば、これはIDがnullの犬にアクセスしようとしていると見なすことができます。ドキュメントでそれを読んだことがない限り、ユーザーがこのジャンプをしているのを見ることはありません。ユーザーがあなたのAPIに対してコードを書き込もうとしていて、単に習慣から末尾のスラッシュを含めて、犬のリストが必要なときに404応答が返されるのはなぜだろうと思います。

17
Mike

二通り。

方法1

子を含む可能性のあるリソースには、常に末尾のスラッシュを使用してください。

ファイルのあるpublic_htmlディレクトリで「GET」を検討してください。

Hello.htmlがファイルの場合は使用できません:

/hello.html
/hello.html/youagain.html

ただし、hello.htmlがディレクトリの場合は可能です。

/hello.html/     (actually /hello.html/index.html)
/hello.html/youagain.html

したがって、「hello.html」に子が存在する可能性がある場合、常に「/hello.html/」であり、「/ hello.html/index.html」(または単に/hello.html/)はこれらの子のリストです。

方法2

"スマート"になります。

$ find
.
./hello.html
./hello.html/index.html

Findコマンドはhello.htmlのタイプを気にしません。気になるディレクトリまたはファイルは、オブジェクトの名前です。 「cp youagain.html hello.html」と書くと、cpはhello.htmlの処理方法を理解できます。 cpはスマートです。あなたのウェブサーバーもスマートです。パス処理ライブラリがあります。ルーティングがあります。これは、名前がオブジェクトであるかディレクトリであるかを統計および通知します。それは何とか何とかにリダイレクトすることができます/あるいは、両方に対して同じ応答を提供することさえできます。これはすごいです!!!仕方。とても技術的です。すべてを実行できるときに、パス文字列を単純に連結したい人はいますか?

2