あなたが私の答えを読む前に、@ Neilに同意したと言いたいです。戦いを選択する必要があります。私たちは通常、最善を尽くしたいと考えていますが、時には議論の余地が少なすぎて、意思に反した決定を下す必要があります。
とにかく、ニールの答えで、私はもう一つのことを見逃しています。ドキュメント。開発者がPOSTリクエスト/search
が安全であることを確認するためだけです。
そうは言った。
1. GETする機会を与える
GET
最初にオプションを検討してください。この質問URLの最大長を確認してください。最長のクエリ文字列が2000文字より長いかどうかを評価します。そうでなく、そうなると思わない場合は、に進みGET
ます。いように見えるかもしれませんが、少なくともURLをブックマークできます。もちろん、メソッドのセマンティクス(べき等、安全、キャッシュ)から派生したすべての利点があります。
1.1クエリ文字列をエンコードしてみてください
たとえば、base64。javascript でもbase 64エンコーディングがサポートされています。
これがどのように機能するかです:
- すべてのフィルターを使用してJSONを構築し、正規化します。
- 文字列に解析する
- エンコードする
- エンコードされたJSONを要求パラメーター(
/search?q=SGVsbG8gV29ybGQh....
)として送信します。
- サーバー側で、パラメーターqをデコードします。
- JSON文字列をデシリアライズします
以前は、可能な限り長いJSON文字列を作成し、エンコードして長さを取得していました。エンコードされた文字列がURLに収まるかどうかを評価します。テストするために、Fiddle.jsに次のスニペットを実装しました。(私はそれがまだうまくいくことを願っています)1
Base 64エンコードは確定的で可逆的であるため、衝突の可能性はありません。
エンコードされたクエリを使用すると、検索をDBに保存したり、URLをブックマークしたり、リンクを共有したりすることもできます。もちろん、文字列をエスケープ/エスケープする必要はありません。
1.2エイリアスで試してください
REST APIの設計方法に関するこのブログを読んで、もう1つの選択肢を思い出しました。一般的なクエリのエイリアス。
これらは次の理由で面白いと思う
クエリ文字列の長さを短くしてください。APIをよりクリーンで使いやすいものにします
GET / tickets /?status = closed&closedAt = xxx vs
GET / tickets / recently-closed /
より多くのエイリアスまたはより多くの要求パラメーターと組み合わせ可能。
GET / tickets /?status = closed&closedAt = xxx&within = 30min vs
GET / tickets / recently-closed /?within = 30min
エイリアスとエンコードされたクエリ文字列を組み合わせることができます
GET / tickets /?status = closed&closedAt = xxx&within = 30min vs
GET / tickets / recently-closed /?q = SGVsbG8g ...
1:JSONを使用しましたが、サーバー側でデシリアライズできるとすぐに他の形式を使用できます。
search?q=t
、search?q=te
、search?q=test
、など。サーバーを傷つけないように、クエリの送信頻度を制限することを検討してください。または、大量の情報を返し、クライアント側でフィルタリングを行うこともできます。ユーザーが物事を大幅に絞り込むことができる幅広いカテゴリを入力した場合、それはうまく機能します。