2009-07-31 4 views
36

私はちょうどWebプログラミングを初めて知り、あるページから別のページにデータを送るabt GetメソッドとPostメソッドを知りたいと思っています。GETメソッドがHTTPのPOSTより速いのはなぜですか?

GetメソッドはPostより速いと言われていますが、私はなぜそれがわかりません Getというのは、Getには255文字しかかからないという理由がありますか? 他の理由はありますか?

+9

アクションに副作用があるかどうかに基づいてGETとPOSTを選択する必要があります。パフォーマンスの違いは認識されません。 – Draemon

答えて

38

スピードはあまりありません。 POSTがより適用可能なケースはたくさんあります。たとえば、検索エンジンはGET URLのインデックスを作成し、ブラウザはブックマークして履歴に表示させることができます。その結果、GETリクエストに基づいてDBを変更するなどの操作を行うと、一部のボットがURLを横断する可能性があるため、有害な可能性があります。

その他の場合はセキュリティ上の問題があります。 GETを使用して資格情報を投稿すると、ブラウザ履歴とサーバーログファイルに表示されます。

+0

これらのメソッドの仕組みは、値の格納に使用される一種のシリアル化と、格納されたデータを取得するための直列化解除です。 –

+1

単純なフォームの提出の場合、両方ともキー値のペアに依存します。 GETはそれらをURL自体(クエリ文字列)に埋め込み、POSTはリクエストの本文にそれを送ります。 –

+0

URLの長さに問題があります。たとえGET(簡単な検索ルックアップのような)であるかもしれないアクションを行っていても、GETによって許可されている長さに制約され、POSTを強制的に選択する可能性があります。 – demongolem

9

httpプロトコルを見ると、POSTまたはGETは、同じように簡単かつ高速に解析する必要があります。私は、パフォーマンスの違いはないと主張するだろう。

私の視点から

HTTP GET

GET /index.html?userid=joe&password=guessme HTTP/1.1 
Host: www.mysite.com 
User-Agent: Mozilla/4.0 

HTTP POST

POST /login.jsp HTTP/1.1 
Host: www.mysite.com 
User-Agent: Mozilla/4.0 
Content-Length: 27 
Content-Type: application/x-www-form-urlencoded 

userid=joe&password=guessme 

生のHTTPヘッダを見て、パフォーマンスをする際に考慮すべきではありませんGETとPOSTを比較する。

+7

GETのパケット数は少なく、POSTです。あなたの例に示されている。処理するのが遅い場合は常にパケットを処理します。より大きいパケットが1バイトであっても、少なくともmemor/cpuのどこかに余分に実装されています。 GETまたはPOSTを比較すると、私はパケットサイズに応じてGETが速くなると言います。 – YumYumYum

+0

@ YumYumYum +1。私のapplicated GETではPOSTよりも2倍高速です! –

0

POSTはヘッダーを大きくしてサイズを大きくしますが、違いは実際には無視できるはずなので、なぜこれが心配すべきかわかりません。

HTTPを話す適切な方法は、データのアクションとPOSTに対してのみGETを使用することです。あなたはそうする必要はありませんが、Googleのボットが、見つけたリンクに従っているために人間が扱うことのみを目的としたデータの挿入、削除、操作などの場合もありません。 。

+0

これは完全に真実ではありません。明確にするために:GETは冪等であることを意味し、一般的には体がありません。 POSTは必ずしも等冪ではなく、一般的には本体を持っています。 HTTP仕様ではそれを許さない(IIRC)が、ほとんどのサーバーではおそらく無視されるため、GETには「一般的に」GETには本体がないことに注意してください。 – Tom

24

HTTPのGETとPOSTにはいくつかの誤解があります。主な違いが1つあります。POSTは必須ではありませんが、GETは冪等でなければなりません。これは、GETが副作用を引き起こさないということです。つまり、何度もWebアプリケーションにGETを送信できます(Ctrl + RキーまたはF5キーを何度も押したと思います)。要求は「安全」です。

私はPOSTでそれを行うことはできません、POSTは、サーバー上のデータを変更することがあります。たとえば、Web上でアイテムを注文すると、サーバー上で状態が変更されているため、アイテムがPOSTで追加されます。追加したアイテムの数は1つ増えました。これをPOSTで実行し、リフレッシュするとブラウザでブラウザが警告します。私がGETでそれを行うと、ブラウザは単にリクエストを送信します。

サーバー上でGETとPOSTは純粋な規約です。サーバー上のPOSTコードをにしないようにするには、開発者として私に任せてください。コールを繰り返してください。これを行うにはさまざまな方法がありますが、それは別の質問です。

GETまたはPOSTを使用して同じタスクを実行すると実際に質問に答えるには、パフォーマンスの違いはありません。

詳細については、RFC(http://www.w3.org/Protocols/rfc2616/rfc2616.html)を読むことができます。

+0

POSTを使用してサーバー側で繰り返しの呼び出しができないようにしていただきありがとうございます。 –

+0

それは彼が率直に言ったものではなく、ポストは結果に変化をもたらしますが、ポストの変更は何も保証されていません。それは、ポスティングデータがurlを使用するよりもユースケースの方が最適であるためです。それはポスト変更の状態を述べています –

7

あなたはGETを "行く場所"と、POSTは "何かをする"と考えるべきです。たとえば、検索結果ページが「場所」であり、後で履歴にブックマークしたり検索したりするため、検索フォームはGETを使用して送信する必要があります。 POSTを使用してフォームを送信すると、ユーザーはフォームを再送信するだけでページを再作成できます。一方、削除ボタンをクリックするなどのアクションを実行する場合は、ユーザーがURLに戻ったときにアクションが繰り返されるため、GETを使用してこれを送信したくない場合。

39

http投稿についての別のことは、httpヘッダExpect: 100-Continueが使用されている場合、2回の呼び出しが可能であることです。最初のブラウザーは、HTTPポストヘッダーとサーバー応答を「HTTP 100 Continue」で送信します。ブラウザはこれを受け取ると、実際の本文を送信します。

http://omaralzabir.com/atlas_2__http_post_is_slower_and_it_s_default_in_atlas/

私は、これは、著者が探していた答えだと思います。

+1

これは間違いなく私が探していた答えです。ありがとう! – nrodic

+0

人、**あなたは確かですか?** 2つのリクエスト??それはナンセンスです! https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods。 GETメソッドの場合、データはリクエストのヘッダの 'query'部分でのみ転送できます。 POST要求の場合、データはリクエスト本体で送信され、 'Content-Type = application/x-www-form-urlencoded'を使用してデータを送信すると、リクエストはほぼ同じサイズになります(ほとんどの場合POST大きい)。しかし、違いは**重要ではありません**、10000リクエストあたりのミリ秒未満です... – maxkoryukov

1

コンテンツタイプが指定する形式で、値がPOST異なりヘッダに送信されるため値がリクエストで送信されわずかに速いでGET。

通常、コンテンツタイプがapplication/x-www-form-urlencodedであるので、リクエストボディは、クエリ文字列と同じフォーマットを使用しています:

パラメータ=ファイルのアップロードを使用すると値&も別の を=フォームでは、代わりにmultipart/form-dataエンコーディングを使用します。これは、形式が異なります。それはもっと複雑です。

1

私は他の回答に同意しますが、POSTリクエストがキャッシュされない間にGETリクエストをキャッシュできることは言及されていませんでした。私は、これがGET要求がより速く実行される主な理由だと思います。 (うち-粗いこれは、時には何の要求が実際に送信されていないことを意味したがって、それは実際に高速でGETリクエストはありませんが、ブラウザのキャッシュ。。)

HTTPメソッド:POST対GET:http://www.w3schools.com/tags/ref_httpmethods.asp

5

だけ私のシンプルなメッセージシステムを作成しています。最初はPOSTを使用して新しいアラートを受信しました。 jQueryで私は持っていました:

$.post('/a/alerts', 'stamp=' + STAMP, function(result) 
{ 
}); 

そして私は$ _POST ['stamp']を使いました。ローカルホストからでも、私はこのような要求ごとに90-100 msを得ました。

$.get('/a/alerts?stamp=' + STAMP, function(result) 
{ 
}); 

をし、PHPで$ _GET [ 'スタンプ']に切り替え: 私は単純に変更します。ですから、1分弱の変化があります。すべてのリクエストは、30-40 msとなります。

したがってGETは、POSTの2倍の速さである可能性があります。もちろん、必ずしもそうではありませんが、少量のデータでは常に同じ結果が得られます。

関連する問題