HTTPプロトコルのGETやPOSTなどのメソッドの必要性は何ですか?


17

要求本文と応答本文だけを使用してHTTPプロトコルを実装することはできませんか?

たとえば、URLにはリクエストが含まれます。リクエストは、サーバー側のプログラミング言語に応じた関数にマッピングされ、サーブレットと応答してHTMLおよびJavaScriptレスポンスが送信されます。

HTTPプロトコルにメソッドの概念があるのはなぜですか?

答えから、メソッドの概念が存在する理由をある程度理解できます。これは別の関連する質問につながります。

たとえば、Gmail作成リンクでは、PUT / POSTリクエストとデータが送信されます。ブラウザはどの方法を使用するかをどのようにして知るようになりますか?サーバーから送信されたGmailページには、Gmail作成要求を呼び出すときに使用するメソッド名が含まれていますか?www.gmail.comを呼び出すとき、GETメソッドを使用している必要がありますが、ブラウザはこのメソッドを使用することをどのように認識していますか?

PS私は答えにコメントするのに十分なクレジットを持っていないので、この質問の背後にある意図に関連する人々によって提起された多くの質問にコメントすることはできません。

いくつかの答えが示すように、DELETEメソッドで新しいユーザーを作成できます。これにより、HTTPプロトコルのメソッドの概念の背後にある意図を疑問視します。クライアントがURLに使用する方法をサーバーに伝える必要があるのはなぜですか。


はいといいえ。HTTPを使用せずにHTTPリクエストを行う方法を知りたいと言うので、あなたの質問はそれ自体と矛盾しますが、私はあなたがやろうとしていることを理解していると思います。つまり、ブラウザを使用せずに、プログラムでデータを取得してデータを取得します。あれは正しいですか?
ロブ

4
HTTPをメソッドなしで定義できるかどうか、つまりメソッドの歴史的根拠を尋ねているのでしょうか。または、現在のプロトコルがそれらなしで使用できる場合、つまり、ドロップメソッドは既存の仕様内にあるでしょうか?
イルカチュウ

@ilkkachu:クライアントがサーバーに何かを実行する方法を伝える必要があるのはなぜですか。クライアントはURLを要求し、URLを使用するだけです。たとえば、サーバーはそれを関数sayサーブレットにマップして、応答を返すことができます。クライアントが何かを実行する方法を提供する必要があるのはなぜですか?
user104656

1
@ user104656、それが私の質問への答えである場合、元のデザインを意味するのか、それとも現在の状況を意味するのかはまだわかりません。(私は、それが必要である、または必要であるとは言いませんでした。)
ilkkachu

@Mars and Others:たとえば、Gmail作成リンクでは、PUT / POSTリクエストとデータが送信されます。ブラウザはどの方法を使用するかをどのようにして知るようになりますか?サーバーから送信されたGmailページには、Gmail作成要求を呼び出すときに使用するメソッド名が含まれていますか?www.gmail.comを呼び出すとき、GETメソッドを使用している必要がありますが、ブラウザはこのメソッドを使用することをどのように認識していますか?
9:20のBioLogic

回答:


33

この回答が最初に書かれてから、質問が変更された/明確にされたことに注意しください。質問の最新の反復に対するさらなる応答は、2番目の水平ルールの後です。

HTTPプロトコルのGETやPOSTなどのメソッドの必要性は何ですか?

これらは、ヘッダー形式、ヘッダーと本文の分離方法の規則などの他のいくつかのものとともに、HTTPプロトコルの基礎を形成します。

要求本文と応答本文だけを使用してHTTPプロトコルを実装することはできませんか?

いいえ、作成したものはすべてHTTPプロトコルではないため

たとえば、URLにはリクエストが含まれます。リクエストは、サーバー側のプログラミング言語に応じた関数にマッピングされ、サーブレットと応答してHTMLおよびJavaScriptレスポンスが送信されます。

おめでとうございます、あなたは新しいプロトコルを発明しました!さて、もしあなたがそれを推進し、維持し、開発するなどのために標準化団体を設立したいなら、それはいつかHTTPを追い抜く可能性があります

私はこれがちょっと冗談であることに感謝していますが、インターネット、TCP / IP、またはサーバーとクライアント間で行われる通信について魔法のようなものは何もありません。接続を開き、いくつかの単語を送信して、会話を形成します。要求が理解され、適切な応答が配信される場合、会話は実際に両端で批准された仕様に従う必要があります。これは、世界のどのダイアログとも変わりません。あなたは英語を話し、隣人は中国語を話します。手を振ったり、ポインティングしたり、握りこぶしを振れば、家の前に車を停めたくないというメッセージを伝えることができれば幸いです。

HTTPに準拠したWebサーバーへのソケットを開いて次を送信した場合、インターネットに戻ります。

EHLO
AUTH LOGIN

(SMTP電子メール送信の開始)その後、賢明な回答は得られません。最も完璧なSMTP準拠のクライアントを作成できますが、この会話は共有プロトコルに関するものであるため、Webサーバーはクライアントと通信しません。共有プロトコルも喜びもありません。

これが、HTTPプロトコルを実装せずにHTTPプロトコルを実装できない理由です。あなたが書いたものがプロトコルに準拠していない場合、それは単にプロトコルではありません-それは別のものであり、プロトコルで指定されたとおりに機能しません

あなたの例を少し実行すると、クライアントが接続し、URLのように見えるものを記述するだけです。そして、サーバーはそれを理解し、HTML / JS(Webページ)のように見えるものを送信します。あなたは何を保存しましたか?GETを言わないことについてのいくつかのバイト?これらの厄介なヘッダーを捨てることについてはもう少しです。サーバーもいくらか保存しました-しかし、それがあなたに送ったものを解決できない場合はどうでしょうか?JPEGで終わるURLを要求し、画像を作成するためにいくつかのバイトを送信したが、PNGである場合はどうでしょうか。その時点で不完全なPNG。進行中のバイト数を示すヘッダーがあれば送信するには、受信したバイト数が実際にファイル全体であるかどうかがわかります。サーバーが帯域幅を節約するために応答をgzipで圧縮したが、通知しなかった場合はどうなりますか?あなたはそれが送ったものを解決しようとしてかなりの計算能力を費やすことになります。

一日の終わりには、メタ情報-情報に関する情報が必要です。ヘッダーが必要です。ファイルには名前、拡張子、作成日が必要です。喜ばせたり感謝したりするために、誕生日を迎える人が必要です-世界はプロトコルとコンテキストに関する情報でいっぱいなので、座ってすべてをゼロからやり直す必要はありません。それは少しのストレージスペースがかかりますが、簡単に価値があります


さまざまなHTTPメソッドの実装が本当に必要ですか?

おそらく、指定されたプロトコル全体を実装する必要はありません。これは通常、すべてに当てはまります。英語のすべての単語を知っているわけではありません。私の中国人の隣人もソフトウェア開発者ですが、別の業界にいて、私の業界で使用されている用語のいくつかは英語は言うまでもありません。良いことは、HTTPの実装に関するドキュメントを入手すること、サーバーを作成すること、クライアントを異なるアーキテクチャの異なるプログラミング言語で作成すること、およびプロトコルに準拠しているために動作することの両方があることです。

ユーザーの誰もGETリクエスト以外を発行したり、永続的な接続を使用したり、JSON以外を本文として送信したり、text / plain以外を受け入れる必要があるため、クライアントブラウザーの非常に限られた要求のみを満たす、実際に縮小されたWebサーバーを記述します。しかし、「ソケットを通過するテキスト」をHTTPとする基本的なルールを廃止することをto意的に決めることはできませんでした。リクエストが次のような文字列であるという基本概念を捨てることはできません。

VERB URL VERSION
header: value

maybe_body

また、応答にはバージョン、ステータスコード、および場合によってはヘッダーが含まれます。いずれかを変更すると(HTTPではなくなります)、それは別のものであり、それを理解するように設計されたものでのみ機能します。HTTPはこれらの定義によるものであるため、HTTPを実装する場合は、定義に従う必要があります


更新

あなたの質問は少し進化しました。あなたの質問に対する回答を以下に示します。

HTTPプロトコルにメソッドの概念があるのはなぜですか?

歴史的には、スクリプトが存在しなかったり、ページが動的であり、メモリ内で動的に生成され、代わりにソケットを押し下げられるという概念でさえ、物事が設計と実装においてはるかに柔軟性に欠けることを理解する必要がありますクライアントによって要求され、ソケットを読み取り、プッシュダウンしたディスク上の静的ファイルであるということは、存在しませんでした。そのため、初期のウェブは他のページへのリンクを含む静的ページの概念を中心としていたため、すべてのページはディスク上に存在し、ナビゲーションは主に端末がURLのページのGETリクエストを行っていたため、サーバーはマッピングできますディスク上のファイルのURLを送信します。また、互いにリンクし、他の場所にリンクしているドキュメントのウェブは進化しているはずであるという考えもありました。

これにより、メソッドの履歴コンテキストが得られます-かつてURLは柔軟性のないビットであり、ディスク上のページを単純に参照していたため、ファイルとサーバーに対する意図をクライアントが説明できるため、メソッドは有用でしたメソッドをさまざまな方法で処理します。URLが仮想であるという概念や、ハイパーテキストの本来のビジョン(実際にはテキストのみ)での切り替えやマッピングに使用されるという概念はありませんでした。

私はこの答えが、物事が変化し始めた正確な日付と引用文献を含む歴史的記録の文書になることを意図していません-そのためにはおそらくウィキペディアを読むことができます-しかし、それは時間をかけて欲求を言うだけで十分ですより多くの勢いでウェブを獲得し、サーバーとクライアントの接続の両端で、拡張しているリッチマルチメディアエクスペリエンスを作成する機会を提供します。ブラウザは、コンテンツをフォーマットするための膨大な数のタグをサポートしました。各タグは、必須のメディアリッチ機能と物事をおしゃれに見せるための新しい方法を実装するために競っています。

クライアント側にプラグインが到着し、プラグインとブラウザー拡張機能はすべて、ブラウザーをあらゆるものの非常に強力なパワーハウスにすることを目的としています。サーバーエンドでは、アルゴリズムまたはデータベースデータに基づくコンテンツのアクティブな生成が大きな推進力であり、おそらくディスク上におそらくファイルがほとんどない程度まで発展し続けています-確かに、画像またはスクリプトファイルをファイルとして保持しますWebサーバーとブラウザーにそれを取得させますが、ブラウザーが表示する画像とそれが実行するスクリプトは、ファイルエクスプローラーで開くことができるファイルではなく、必要に応じて行われるコンパイルプロセスの出力である生成されたコンテンツです、ピクセルのビットマップ配列ではなくピクセルを描画する方法を説明するSVG、またはTypeScriptのようなスクリプトのより高いレベルのフォームから発行されたJavaScript

最新のマルチメガバイトページを作成する際に、おそらくその一部のみがディスク上の固定コンテンツになります。データベースデータは、ブラウザが使用するhtmlにフォーマットおよび整形され、URLによって何らかの方法で参照される複数の異なるプログラミングルーチンに応じてサーバーによって実行されます。

私は質問に対するコメントで、まるで完全な円に似ていると言いました。コンピューターに数十万の費用がかかり、部屋がいっぱいになったとき、複数のユーザーがキーボードとマウス、緑色の画面、いくつかのテキストを送信し、いくつかを取得する何百ものダム端末を介して1つの超強力な中央メインフレームを使用できるようにすることが一般的でしたテキスト出力。コンピューティングパワーが増加し、価格が下がるにつれて、人々は初期のメインフレームよりも強力なデスクコンピューターと強力なアプリをローカルで実行できるようになり、メインフレームモデルは時代遅れになりました。しかし、それは決して消えることはありませんでした。なぜなら、物事は進化して逆になり、便利なアプリ機能のほとんどを提供する中央サーバーと、画面に描画する以外はほとんど実行しない100台のクライアントコンピューターにいくらか戻って サーバーとの間でデータを送受信します。あなたのコンピューターが単語と見通しのコピーを同時に実行できるほどスマートだったその中間期間は、再びオフィスのオンラインに道を譲りました。そこでは、ブラウザーは画面に絵を描き、文書/メールを編集するためのデバイスです。サーバー上に存在するものとして書き直し、そこに保存され、送信され、他のユーザーと共有されます。これは、ブラウザーが、他の場所に存在するこのもののある部分を部分的に表示する単なるシェルであるという概念です

答えから、メソッドの概念が存在する理由をある程度理解できます。これは別の関連する質問につながります。

たとえば、Gmail作成リンクでは、PUT / POSTリクエストとデータが送信されます。ブラウザはどの方法を使用するかをどのようにして知るようになりますか?

デフォルトではGETを使用します。規則/仕様により、URLを入力してreturnキーを押すとそれが決定されるため、

サーバーから送信されたGmailページには、Gmail作成要求を呼び出すときに使用するメソッド名が含まれていますか?

これは、上記のコメントで言及した重要なことの1つです。最新のウェブでは、ページについてでさえありません。ページがディスク上のファイルである場合、ブラウザはGETします。その後、データをテンプレートにスロットすることにより、主に動的に生成されるページになりました。しかし、それでも「サーバーからの新しいページのリクエスト、ページの取得、ページの表示」プロセスが含まれていました。ページスワッピングは非常に滑らかになりました。レイアウトの読み込みやサイズ変更、ジャークが表示されなかったため、スムーズになりましたが、それでもブラウザがページ全体またはページの一部を別のものに置き換えていました。

物事を行う最新の方法は、単一ページのアプリケーションを使用することです。ブラウザーはメモリ内に特定の方法で表示されるドキュメントを持ち、bservrの呼び出しをスクリプティングして情報のナゲットを取得し、ドキュメントを操作してページの一部が新しい情報を表示するように視覚的に変更します。ブラウザが別の新しいページをロードする; それは、UIになり、その一部が、言葉や見通しのような典型的なクライアントアプリのように更新されます。新しい要素は他の要素の上に表示され、ダイアログウィンドウなどをシミュレートしてドラッグできます。これはすべて、開発者が望むhttpメソッドを使用してリクエストを送信し、ブラウザが描画しているドキュメントを取得してデータを取得するブラウザスクリプトエンジンです。最新のブラウザーは、オペレーティングシステム全体または仮想コンピューターのような優れたデバイスであると考えることができます。画面上での描画、サウンドの再生、ユーザー入力のキャプチャ、処理のための送信をかなり標準化した方法を備えたプログラマブルデバイス UIを描画するために必要なことは、UIを作成するhtml / cssを提供してから、常にHTMLを微調整して、ブラウザが描画するものを変更することだけです。ええと、人々はアドレスバーの変更を見る/それを意図の方向として使用することに慣れているので、ナビゲーション(新しいページ全体を要求する)が行われていなくても、単一のページアプリがURLをプログラムで変更します UIを描画するために必要なことは、UIを作成するhtml / cssを提供してから、常にHTMLを微調整して、ブラウザが描画するものを変更することだけです。ええと、人々はアドレスバーの変更を見る/それを意図の方向として使用することに慣れているので、ナビゲーション(新しいページ全体を要求する)が行われていなくても、単一のページアプリがURLをプログラムで変更します UIを描画するために必要なことは、UIを作成するhtml / cssを提供してから、常にHTMLを微調整して、ブラウザが描画するものを変更することだけです。ええと、人々はアドレスバーの変更を見る/それを意図の方向として使用することに慣れているので、ナビゲーション(新しいページ全体を要求する)が行われていなくても、単一のページアプリがURLをプログラムで変更します

www.gmail.comを呼び出すとき、GETメソッドを使用している必要がありますが、ブラウザはこのメソッドを使用することをどのように認識していますか?

本当です。指定されているため。最初のリクエストは、これまで常にそうであったように、最初のhtmlを取得してUIを描画し、それを永久に突いて操作するか、他のスクリプトで別のページを取得して、反応して反応するUIを突いて操作します

いくつかの答えが示すように、DELETEメソッドで新しいユーザーを作成できます。これにより、HTTPプロトコルのメソッドの概念の背後にある意図を疑問視します。クライアントがURLに使用する方法をサーバーに伝える必要があるのはなぜですか。

歴史。レガシー。理論的には明日、すべてのhttpメソッドを投げ捨てることができます。URLはデータを保存するサーバーに示す切り替えメカニズムになりうるため、URLは処理可能であるため、メソッドは廃止されます。ドラフトメールとしての本文、またはドラフトの削除-サーバーに/ emails / draft / save / 1234ファイルがありません-サーバーは、そのURLを選択して本文データの処理方法を知るようにプログラムされていますID 1234の下にあるドラフトメールとして

そのため、メソッドを廃止することは確かに可能ですが、メソッドを中心に成長したレガシー互換性の大きな重みを除きます。必要なものだけにそれらを使用する方が良いですが、大部分は無視して、代わりにあなたの物を動作させるために必要なものを使用します。メソッドが必要なのは、アプリが作成されたブラウザおよびサーバーにとって何か意味があることを覚えておく必要があるためです。クライアント側のスクリプトは、基礎となるブラウザを使用してデータを送信する必要があり、ブラウザが要求どおりに実行するメソッドを使用する必要があります-おそらくPOSTは可変情報をすべてURLにパックし、長さに制限があるためです多くのサーバーで。クライアントはサーバーからの長い応答を望んでいます-応答ボディを持つことはまったく想定されていないため、HEADは使用しないでください。


1
「あなたが書いたものがプロトコルに準拠していない場合、それは単にプロトコルではない」から、キャスリングや傍観者のポーンキャプチャなしでチェスをする「ハウスルール」があると言った誰かにフラッシュバックを得ました。「これは面白いゲームですが、それらのルールがなければ「チェス」ではありません。」ゲームのルールを変更すると、もう同じゲームではなくなります。
モンティハーダー

4
メソッドやヘッダーがなければ現在のHTTPにならないことについて円を書きましたが(質問ではヘッダーについては何も言わなかった)、メソッドの目的とプロトコルがメソッドなしで同じ目的で機能するかどうかは決して言いません—これが質問の目的でした。
aaa

1
メソッドが「何のために」あるのかを言う必要があるのはなぜですか?そのための仕様書があります。HTTPは魔法ではなく、FTP、SMTP、RTMPでもありません-それらはすべて、ソケットを下るバイトだけですが、プロトコルを作成するのは、バイトが準拠する順序、プレゼンテーション、ルール(プロトコル)ですです。あなたは私がしなかった質問で何かを読んだことがありますが、あなたの質問に答えても構いません:メソッドなしでプロトコルを作ることができますか?-本当ではありませんが、メソッドの意味に依存します。HTTPはHTTPメソッドを備えた唯一のプロトコルですが、考えられるすべてのプロトコルは..
Caius Jard

..メソッドと呼ぶ相互作用の所定のパターン。それらがなければ、それらはプロトコルではなく、信頼できるプロセス間/システム間通信を達成することはできません。
カイウスジャール

実際、私はメソッドが何のためにあるのかを述べるための仕様書があると言った-それは必ずしも真実ではない。メソッドは「何か」のためである必要はありません。GETに応答してものを削除し、DELETEに応答して新しいユーザーを作成するWebサービスを作成できます。メソッドに必須の動作はありません。指定されているために存在するだけです。システムはプロトコルの上位に構築されます。これは、ハードワーク(プロトコルとそれを使用するシステムを発明する必要はありません)の一部を取り除くためですが、両側を制御するとき、プロトコルのどの側面が使用されるかfor)はかなりarbitrary

12

HTTPは、リモートプロシージャコールの一般的な原則の1つの特定のケースと考えることができます。要求の変数フィールドを使用して、サーバーに必要なものを伝えると、サーバーはそれに応じて応答します。今では、「Web 2.0」の複雑な対話性により、これらの同じ機能がリクエストのすべてのフィールドに表示されます。URL、ヘッダー、本文、および各アプリサーバーとアプリは独自の方法でそれらを理解します。ただし、もともとWebはよりシンプルで、静的なページを使用していたため、HTTPメソッドで十分な対話性のレベルが提供されると考えられていました。特に、HTTPには多くのメソッドがありますが、使用されることはめったにありませんが、RESTのおかげで一部のメソッドのみが表示されます。例えば、PUTとDELETEはRESTの前にmo死し、TRACEとPATCHはまだ見えません。要点は、HTTPのRPCモデルが

RESTは、PUTとDELETEが戻された場合、HTTPメソッドがほとんどのアプリの典型的なCRUDユースケースを提供することに注意することで、提案されているものとまったく逆になりました。

HTTPメソッドにはセマンティクスが割り当てられており、ブラウザやプロキシサーバーなどのミドルウェアによって尊重されることに注意してください。POST、PUT、DELETE、およびPATCHリクエストには副作用があり、and等ではない可能性が高いため、クライアント側のアプリとミドルウェアには注意が必要ですユーザーからの明示的なアクションなしにこれらのリクエストを実行しないようにします。実際には、設計が不十分なWebアプリは安全でないアクションにGETを使用しました。たとえば、Google Web Acceleratorプリフェッチャーはそのようなサイトのデータを削除することで問題を引き起こしたため、ベータ版は起動後すぐに中断されました。

したがって、「できるか」という質問に答えるには、サーバーアプリに実行するアクションを伝えるプロトコルに同意する必要があります。次に、URL / bodyのどこかに引数を入れます。アクションの対象アイテム。アクションのセットは特定のアプリによってのみ制限されるため、拡張可能なプロトコルが必要です。ただし、どのリクエストが安全であるかをクライアントアプリに知らせる必要があります。また、おそらくキャッシュ制御など、他のニュアンスを考慮する必要があります。


4
「PUTとDELETEはREST以前はmo死でした」事実ではありません。WebDAVはどのように機能したと思いますか?
パトリックメヴゼク

3
@PatrickMevzekええ、でもWebDavはcom睡状態ではなく生きていると考えるのに十分な人に使われていましたか?^^
フランク・ホプキンス

1
@PatrickMevzek WebDAVは、実際にはHTTPとは別のプロトコルです。
夕暮れ8

@duskwuff tools.ietf.org/html/rfc4918「Web分散オーサリングとバージョン管理(WebDAV)用のHTTP拡張機能」。それほど離れていない、それは明らかにそれの上にあります。
パトリックメヴゼク

1
PATCHは、部分的な変更(別名更新)を示すためにRESTによって使用されます。
jmoreno

7

開発者としての私の個人的な観点から、APIエンドポイントの作成がはるかに簡単になります。たとえば、Webサイトで製品を管理するコントローラーを作成する場合、同じURLを使用して複数の異なる操作を実行できます。

例:

GET https://example.com/api/products/1234

これにより、製品1234の詳細が取得されます。


POST https://example.com/api/products/1234

これにより、リクエスト本文のデータを使用して、ID 1234の製品が作成されます。


PUT https://example.com/api/products/1234

これにより、リクエストボディのデータで製品1234が更新されます。


DELETE https://example.com/api/products/1234

これにより、ID 1234の製品が削除されます。


操作ごとに異なるエンドポイントを作成することもできますが、それによりプロセスが複雑になり、他の開発者にとって理解しにくくなります。


1
これは、他のいくつかの質問ほど完全に(または多分)正確な質問に答えることはできませんが、個々のメソッドを継続して使用するための現代的な根拠です。+1
TCooper

6

HTTPプロトコルのGETやPOSTなどのメソッドの必要性は何ですか?

と思われますが、HTTPサーバがちょうど役立つようにあった昔忘れてしまったファイルを、スクリプト、CGIを実行していない、またはそのような動的コンテンツを作成していません。

リクエストの方法は基本的なもの、標準化の動詞のセットに何をすべきか、それらのファイルを ...

  • GETはダウンロードを意味します
  • HEADは
  • PUTはアップロードを意味します
  • DELETEは削除を意味します
  • POSTは、データを送信することを意味します
  • OPTIONSは、何ができるかを教えてくれることを意味します

HTTP / 0.9の日では、リクエストラインがあるプロトコルの要求レグで唯一のもの。要求ヘッダー、応答ヘッダーはありません。入力するだけで、を押すと、サーバーは応答本文(HTMLコンテンツ)を返し、さようならありがとう(接続を閉じる)。GET /somefileEnter

どうして このように設計されたのを尋ねるだけだったら?私の答えは、当時存在していた種類のコンテンツ交換を処理するために元々書かれいたためです。つまり、ユーザーのリクエストに応じて静的HTMLファイルを提供します。

ただし、現代のアプリケーションサーバーでこれらのセマンティクスを処理する方法について質問する場合は...

要求本文と応答本文だけを使用してHTTPプロトコルを実装することはできませんか?

さまざまなHTTPメソッドの実装が本当に必要ですか?

私の答えは、あなたがやりたいことを何でもしますが、プロトコルの期待に反するような方法でアプリケーションロジックを実装するべきではないことに注意してください:GETのような期待はデータを変更すべきではありません(または少なくともvery 等な結果をもたらす)、HEADはGETと同じ結果になりますが、応答本文がない場合、PUTはターゲットURIのコンテンツを使用可能にします(成功した場合)。

その意味を慎重に考慮せずに期待に反すると、次のようなさまざまな不快なことが起こります...

  • GETメソッドをデータ送信に使用すると、サーバーが414 " URI Too Long "エラーを顔に吐き出す場合があります。
  • GETメソッドをデータ変更に使用すると、ユーザーがキャッシングプロキシの背後にいるとき、またはユーザーがブックマークからURLを呼び出したとき(またはWebクローラーがそれに到達したとき)に予期しない変更が発生することがあります。
  • HEADメソッドに不適切に応答すると、自動サイトチェックツール(例wget --spider:)がサイトに留まることがわかります。
  • POSTメソッドをコンテンツのダウンロードに組み込むと、ブックマークを付けたり、ブラウザにURLを入力したりすることもできなくなります。
  • などなど...

初心者はルールを知っていますが、ベテランは例外を知っています。

とにかく、いくつかの狭いユースケースのいくつかのルールに反する有効な言い訳を見つけることになるかもしれません。ただし、必ず調査を行い、すべての可能性を検討してください。そうしないと、相互運用性が失われ、「ユーザーエクスペリエンス」が損なわれます。

ユーザーがテストした主流の有名ブランドのクライアント/ユーザーエージェントの最新の光沢のあるロールアウトを常に使用するという保証はありません。ニーズに合わせたローカルブランド(私を含む)、隣の専門店で注文したカスタムブランド、または倉庫から掘り出したビンテージブランドを使用する場合があります。これらすべての場合でも、あなたのサイトは依然として合理的なサービスを提供することが期待されています。それが私たちに標準がある理由です。

不注意に規格を破ることは、ユーザーに差別を適用していることも意味します。


3

理論的には、あらゆる場所でgetを使用でき、それは一種の作業になります。一部のソフトウェアは、リクエスト本文でGETを使用します(Elasticsearch / kibanaを探しています)。もちろん、これは恐ろしいことです。

最も重要な理由は、メソッドごとにセマンティクスが異なるためです。あるものは安全であり、あるものはdem等です。一部は両方です。どれがどれか

これは、他のアプリケーションと対話する場合などに重要です。GETエンドポイントには副作用はありません。これはグーグルがあなたの側をcっているときに重要です。PUTはべき等であると想定されています。これは、障害が発生した場合にクライアントが自由に再試行できることを意味します。これは、POSTの場合ではありません。POSTでは、投稿要求でf5を押した場合にブラウザーにい確認ボックスが必要になる理由です。

何を参照してください。あなたはPOSTを使用している必要がありますGETを使用する場合に発生することができます


1
ボディを使用したGETは、実際に仕様に準拠しています。
TRiG

面白い。それが2014年に変更されたように思える
エスベンSkovがペダーセン

1
ボディを使用したGETは準拠していません。具体的に違反しているわけではありません。現在は定義されていないため、一部のクライアントではサポートされていません。cURLはその一例だと思います
Mars

2

GET、POSTなどを、同じ関数のオーバーロードとして、またはゲッターとセッターとして考えることもできます。

GET_MyVar() 入力パラメーター(別名要求本文)は受け取りませんが、何かを返します。

POST_MyVar(string blah)入力(再び、リクエスト本文)で何かを行い、何かを返すかもしれません。(少なくとも応答コードを返す必要があるため、関数が実行されたことがわかります!!)

DELETE_MyVar() また、おそらく何も取らず、何かを削除することが期待されます。

はい、すべてを次の方法で実装できます。
MyVar(string Action, string? blah)

この方法では、1つの呼び出しだけを受け入れ、他のパラメーターに基づいて何をするかを選択できます。

しかし、このアプローチの便利さの1つは、ブラウザーとサーバーがこれらの動作を最適化できることです。たとえば、サーバーがのすべてのリクエストをブロックしたい場合がありAction==DELETEます。たぶん、ブラウザはキャッシュすることを望んでいます。Action==GET.そうでなければ、すべての関数で、if (Action==Delete) {return AngryFace}

プロトコルに従ってすべてを正確に実装する必要はありませんが、プロトコルは基本的に私たち全員が従うことを決めたルールのセットです。そうすれば、サーバーを見ていなくても、あなたのサイトが何をするのか簡単に推測できます!


1

HTTPメソッドにはさまざまな目的があります。一般に、GETダウンロード用およびPOSTアップロード用です。

要求本体と応答本体だけを使用するHTTPプロトコルの一部を実装する唯一の方法は実装することでしょうPOSTGETリクエスト本文はありません。ヘッダーを持つリクエスト自体のみがあり、ボディはありません。これは、ドキュメントをダウンロードするための単なるリクエストです。 POSTリクエスト本文(ファイルのアップロード)とレスポンス本文(結果を示すドキュメント)の両方があります。

それで、あなたはただ実装POSTして完了できますか?標準のブラウザでサイトを使用できるようにする場合ではありません。ブラウザが送信するデフォルトのリクエストタイプはGETです。 POSTリクエストは通常​​、Webページのフォームが送信されたとき、またはAJAX呼び出しに対してのみ送信されます。この特定のサーバーがAJAX呼び出しにのみ使用されていて、ユーザーに表示されるページには使用されていない場合にのみ、あなたPOSTだけで逃げることができるでしょう。

ブラウザはHEAD、ドキュメントを前回ダウンロードしてから変更されたかどうかを確認するためにリクエストを送信することもあるため、少なくとも同様に実装することをお勧めします。

いずれにせよ、サイトに最初からWebサーバーを実装する正当な理由はありません。HTTPプロトコルは複雑です。さまざまなメソッドに加えて、パイプライン化およびチャンク化されたリクエストも実装する必要があります。HTTPプロトコルを処理するApache、Nginx、IISなどのWebサーバー上にWebアプリケーションを構築する方がはるかに簡単です。サーブレットについて言及しているので、おそらくサーブレットを実行するTomcatまたはJBoss Webサーバーを使用する必要があります。


この質問は、Aウェブサイトよりも大きなレベルにあると思います。「なぜGETとPOSTを実装する必要があるのか​​」ではなく、「なぜブラウザーにGETとPOSTを実装するのか」
火星

@Marsその場合、質問はこのサイトのトピックではありません。
スティーブンオステルミラー

これは私が推測する歴史的な質問であり、ウェブサイト全体に影響する問題に該当するようです(質問ページから)。しかし、OPは消えたので、それは常に謎だと思います
Mars

0

あなたが正しい、私たちはそれを行うことができます、GET、POST、PUTなどは歴史的な慣習であり、HTTPがPOSTメソッドだけに取って代わられるのであれば、GETを排除することは大きな仕事であると認めなければなりませんが、それはできなかった、馬はすでにその1つにボルトで固定されています


1
「GET、POST、PUTなどは単なる歴史的な慣習です」-慣習ではありません。それらは正確に指定された動作を持ち、さらに、それらは異なる動作を正確に指定しました。
イェルクWミッターク

Web API開発者として、GETとPOSTを簡単に交換できます。逆も同様です。これが私の答えの基礎です。
user104723

-1

提案されたプロトコルは、ハッカーに対する安全性が大幅に低下します。

URLに変数などの情報を保存することからWebサイトが遠ざかる理由があります。その理由は簡単です。攻撃者がシステムを攻撃する非常に簡単な方法を提供します。平文のURL情報を観察することで、Webサーバーに送信されるデータが構築される方法を決定できます。その後、この情報を使用して、悪意のあるコードまたはデータをサーバーに注入できる特別に構築されたURLを使用して、サーバーで攻撃を実行できます。


HTTPSの場合を除き、GETのコンテンツはネットワーク上で平文ではありません...そして、攻撃者は、運、総当たり、またはその他のテクニックによって悪意のあるコードを注入することができます。すでに発生しているものを見る必要はありません。
パトリックメヴゼク
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.