私は自分が書いているいくつかのWebサービスを持っており、可能な限りRESTfulになろうとしています。IIS / ASP.NET/SharePoint内で実行されているHTTPHandlerを使用してこれらのWebサービスをホストしています。
私のサービスのほとんどはHTTPGETを期待しています。私はこれらのうちの2つを持っており、それらは単にいくつかのデータ(つまり、クエリ)を返し、べき等になりますが、パラメーターは多少複雑になる可能性があります。どちらも、少なくともURLのPATH部分で許可されていない文字をサービスのパラメーターに含めることができます。
IIS、ASP.NET、およびSharePointを使用すると、URLパス内の次の文字は、Urlエンコードされていても、HttpHandlerに到達しないことがわかりました(要求が爆発し、これを簡単に制御できません) :
- %(%25)
- &(%26)
- *(%2a、ただしUrlエンコードしませんでした)
- +(%2b)
- :(%3a)
- <(%3c)
(%3e)
次の文字が私のHttpHandlerに到達しましたが、Urlエンコードされていても、UriTemplateはそれらを適切に処理できませんでした。
(%23)
- 。(%2eですが、Urlエンコードしませんでした。UriTemplateは「。」を削除しました。isが/の前の最後の文字である場合)
- ?(%3f)
- /(%2f-UrlEncodedであっても、明らかな理由でUriTemplateが失敗します)
- \(%5c)
ですから、私はある程度徹底しましたが、クエリ文字列でこれらのurlエンコードされた文字をテストする必要があります。これはほとんどの部分で機能するようです。
私のサービスの1つでは、パラメーターである特殊文字は意味的にクエリ/フィルター(実際には検索サービスの検索用語)の一部ですが、別のサービスでは、実際にはクエリ/フィルターの一部ではないため、理想的にはその一部です。クエリ文字列ではなくパス。
私の質問は、どのオプションが最適ですか?これが私が知っているいくつかです:
HTTPGETとクエリ文字列を使用します。 特殊文字を使用する可能性のあるものはすべて、クエリ文字列とUrlEncodedに含める必要があります。 これは私が傾いているところですが、非常に長いクエリ文字列が心配です(IEには2083の制限があります)
パス内でHTTPGETおよびbase64エンコーディングを使用します。特殊文字を使用する可能性のあるパラメーターには、URLにModified Base64を 使用し、必要に応じてパスの一部として保持します。 私はこれを試しましたが、うまくいきましたが、ちょっと醜いです。非常に長いクエリ文字列についてはまだ懸念があります。
HTTPPOSTとメッセージ本文を使用します。 特殊文字を使用する可能性のあるものはすべて、リクエストの本文に含める必要があります。 まともな解決策のように見えますが、投稿はべき等ではないと理解されており、(私が思ったように)一般的に変更を目的としています(ここでは変更は発生していません)。
HTTPGETとメッセージ本文を使用します。 特殊文字を使用する可能性のあるものはすべて、リクエストの本文に含める必要があります。SO:リクエスト本文とRoyFieldingを使用したHTTPGETによると、これは悪い考えのようです。
リクエストの大きさに応じて、上記の#3と#1または#2のいずれかを組み合わせて使用します。
他の???
場合によっては、特殊文字を防ぐために変更できる場合もありますが(そうする場合もあります)、すべての場合にこれを実行できるわけではありません。
URIの長さに関して、RFC2616Sec3.2.1は次のように述べています。
HTTPプロトコルでは、URIの長さに事前の制限はありません。サーバーは、提供するすべてのリソースのURIを処理できる必要があり、そのようなURIを生成できるGETベースのフォームを提供する場合は、無制限の長さのURIを処理できる必要があります。URIがサーバーが処理できるよりも長い場合、サーバーは414(Request-URI Too Long)ステータスを返す必要があります(セクション10.4.15を参照)。
Note: Servers ought to be cautious about depending on URI lengths
above 255 bytes, because some older client or proxy
implementations might not properly support these lengths.
さらに、InternetExplorerの最大URL長は2,083文字です。