0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

URL長すぎ問題への対処

Posted at

概要

GETリクエストではデータがURLに表示されるため、データ量に制限があります。 一方、POSTリクエストはデータをHTTPリクエストのボディに含めるため、より多くのデータを安全に送信できます。

しかし、検索機能などでGETリクエストを行うとURLが長くなりすぎ、一定の長さを超えるとエラーが発生する問題に直面します。検索条件が増えると、URLがどんどん長くなり、エラーの起きるケースが出てきたのです。

このような問題に対して、以下の解決策を検討しました。

検討した解決策

  1. URLの長さの上限を引き上げる

    • URLの許容長を増やす案もありましたが、これは根本的な解決にならないため却下。
  2. POSTリクエストに変更

    • データ量の制約を回避するためにPOSTリクエストに書き換える案も検討しましたが、工数が大きすぎるため断念。

最終的な解決策

IDを使用してURLを短縮

クエリパラメータに名前や長い文字列ではなく、対応するIDを使うように変更しました。

変更前の例

/customer_list/?first_name=John&last_name=Tommy&company_name=McKinseyCompanyInc

変更後の例

/customer_list/?first_name=1&last_name=4&company_name=2

このように修正することで、URLの長さを大幅に短縮しました。これでも200以上の検索条件を重ねればエラーが起きる可能性がありますが、現実的には十分な対応と判断しました。

【Web開発初学者向け】 GETリクエストとPOSTリクエストの違い

GETリクエスト

  • 主に情報を「取得」するために使用。
  • データはURLのクエリパラメータとして送信。
  • データがブラウザのアドレスバーに表示されるため、ブックマークや共有が可能。
  • 制約: URLに表示されるため、データ量に限界があり、機密情報には不向き。

https://example.com/news?date=2024-08-07

この場合、date=2024-08-07がクエリパラメータです。サーバーはこの日付に基づくニュースを返します。

POSTリクエスト

  • 主に情報を「送信」するために使用。
  • データはHTTPリクエストのボディに含まれるため、URLには表示されない。
  • URLの長さ制限を回避でき、機密情報の送信にも適している。
  • 主にフォーム送信やファイルアップロードに利用される。

オンラインショッピングで購入手続きをする際、住所やクレジットカード情報をPOSTリクエストでサーバーに送信します。


GETリクエストとPOSTリクエストを例えてみよう

GETリクエスト

図書館で本を借りるようなものです。
生徒がカタログシステムに「科学の本」と入力して検索し、その結果を受け取る過程に似ています。検索条件は公開されており、誰でも見ることができます。

POSTリクエスト

先生のロッカーに、テスト回答用紙を入れるようなものです。
生徒が試験の答案を封筒(HTTPボディ)に入れ、先生のロッカー(サーバー)に投函します。他の人は内容を知ることができません。

まとめ

GETリクエストのデータ量制限を回避するため、名前をIDに変換してURLを短縮する方法を採用しました。この対応により、エラーを防ぎつつ現実的な工数で問題を解決できました。

GETとPOSTの使い分けや特徴を理解することは、Web開発における基本的なスキルです。特に、データ量やセキュリティ要件に応じた適切なリクエスト選択が重要です。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?