理由は、GETメソッドはURLで送信するためURLの長さに制限があるのに対し、POSTメソッドはストリームを使用するため理論上送信できる容量に制限がないからです。
次の説明を見てください: 「URL の長さは制限されています。」 制限されているのはブラウザ側ですか? それともサーバー側ですか? インターネット上の Google の結果では、実際には URL の長さが制限されていることが示されています。ブラウザによる制限。IE では URL の長さが 2083 バイトに、Opera では 4050 バイトに、Netscape では 8192 バイトに制限されます。 HTTP プロトコル自体には GET メソッドの長さに制限がないと言われています。では、ブラウザを使用せずにプログラムから HttpRequest を送信する場合、送信される GET の長さは無限にできるでしょうか。この考えを念頭に置いて、次の実験を実行しました。
クライアント側ではJavaで実装され、サーバー側にHttpRequestを送信し、GETメソッドを使用します。サーバー側では、Apache モジュールを設計し、ap_rprintf を使用して strlen(r->args) をレスポンスとして出力し、Java 側に返します。
GET メソッドによって渡される文字列の長さを継続的に増やしていくと、URL の長さが 8208 バイトを超えると、Java が IO 例外をスローすることがわかります: サーバーが URL に対して HTTP 応答コード: 414 を返しました: .....
414はどのようなエラーを表しますか?
414 - リクエスト URL が長すぎます (参照: http://www.websitepulse.com/kb/4xx_HTTP_status_codes.html)
サーバー側でURLの長さに制限があるので、GETメソッドで送信できるデータにも制限があることがわかります。ただ、この制限はサーバーの処理能力に依存する可能性があるか、どこで設定するかが明確ではありません。 (また勝手な推測をするようになりました。これは良い習慣ではないようです)。
さて、くだらない話を始めましょう:
実際、これは当然です。結局のところ、HTTP プロトコルは UDP であり、UDP パケットにはサイズ制限があります。では、なぜ POST は大量のデータを転送できるのでしょうか? Apache モジュールで POST データを読み取ろうとするまで、私はまったく深く理解していませんでした。それを説明するには「フロー」という言葉を使ってください。実際、POSTデータは解析する際にチャンクで読み取られ、UDPの観点から理解すると、複数のUDPパケットに分割されて渡され、1つずつ読み込むことができます。