2021年11月28日日曜日

プログラマですが、GETとPOSTの違いが未だ理解できていません。ググっても何が何だかさっぱり。基礎が出来ていない等は抜きにして、異業種や小中学生・はたまた猿でも分かるようにどなたか解説頂けませんか?

https://jp.quora.com/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%81%A7%E3%81%99%E3%81%8C-GET%E3%81%A8POST%E3%81%AE%E9%81%95%E3%81%84%E3%81%8C%E6%9C%AA%E3%81%A0%E7%90%86%E8%A7%A3%E3%81%A7%E3%81%8D%E3%81%A6%E3%81%84%E3%81%BE%E3%81%9B
シェアしました。

httpのGET, POSTメソッドのことと解釈して回答いたします。

歴史的な経緯だと元々Webシステムというのは、文書を共有するために作られました。CERN(欧州素粒子物理学研究所)には世界中から研究者が集まっていました。しかし研究者は色々なPC, ソフトを使っていて電子データでの共有がままなりませんでした。ある人はMacのWordPerfect, ある人はWindowsでMS Wordある人はUnixでTexというような状態で情報を交換するにも一苦労でした。そこで文書を共有するシステムを組むことになりました。また、文書と文書を関連付けるリンクがあると便利と考えました。このリンクをハイパーリンクと呼び、リンクの仕組みを備えた文書ととしてハイパーテキストを考案しました。そして記述方法としてHyperTextMarkupLanguageを考えました。そうですHTMLの登場です。そしてコンピュータネットワークでハイパーテキスト文書を共有するプロトコルとしてHyperTextTransferProtocol(ハイパーテキスト転送プロトコル)を策定しました。そうですhttpの登場です。その名の通りhttpはネットワーク上でハイパーテキスト文書を転送する方式、約束事です。サーバに文書投稿する約束事がPOSTメソッドです。サーバから文書を持ってくる約束事がGETメソッドです。他にも削除にはDELETEメソッド、更新にはUPDATEメソッドがあります。ほかにはPATCHとかHEAD, OPTIONとかもあります。そして研究者たちは効率よく情報を共有することになりました。めでたしめでたし。で終わりませんでした。CERNはこのシステムを皆にも使ってもらおうと、ソースコード含め全てインターネットに公開しました。当時のインターネットは一般公開されていたといえど 、その殆どは大学や研究機関が繋いでいました。なのでこの仕組みを自由に使ってインターネット上で研究論文などの文書を共有してみんなで幸せになりました。めでたしめでたし。でも終わりませんでした。とある大学生がこれに、画像が表示できたり、音が出たり出来たら面白くね?サーバ側でプログラマブルに文書を生成出来たりしたら、インタラクティブなものが出来て面白くね?データベースとか連携したら便利じゃね?と思いHTMLとhttpを拡張しました。そしてこれも無料で公開しました。そうしたら研究以外でも情報を公開する大学生等に大人気!趣味のサイトとか掲示板などに交流サイトとかを立てはじめました。これで大学生たちに大人気!面白いね!めでたしめでたし。で終わらず今に至ります。

ちょっと悪ノリしましたが、このことから元々はhttpというのは、ハイパーテキスト文書をやり取りするだけのものだったのです。文書を見るのにGETメソッド。文書をサーバに上げるのにPOSTメソッドが作られましたが、今ではPOSTのその機能は残ってません。POSTはあらゆるデータをサーバへ送るのに使われています。GETメソッドはurlで指し示したファイルをもってきてブラウザに表示させるという役割を持っています。なので当初の目的はサーバ上の静的データを持ってくるのはGETメソッドで、逆にファイルをサーバに上げるのはPOSTです。POSTはそのbodyにデータを乗せて送ることができます。そしてその結果をサーバから受け取りブラウザに表示します。掲示板サイトとかではこのPOSTの仕組みを使っています。FormをSubmitするとPOSTメソッドでbodyにFormデータを入れてサーバに送ります。GETメソッドでもFormSubmit出来ますが、これだとbodyにデータを入れられないのでurlパラメータになります。そしてサーバで処理されて応答結果として掲示板画面のHTMLを返します。これをブラウザが表示します。元々は静的データであるハイパーテキスト文書を取扱うものだったのですが、ある大学生が面白がって拡張してしまったため、今のような事態になったわけです。DELETE, UPDATE, PATCHは暫く使いどころがなかったので、ほぼ忘れられました。しかしWebAPIのRESTfulの登場で復活しました。

疲れたのでここまでにします。半分うろ覚えでかいたので間違ってたらコメントで指摘ください。

Bacigalupo Diego
さんから1件のコメント

どっちもHTTPリクエストのメソッド(種類とでも言いましょうか)で、

仕組み上は名前以外に大した違いはありませんが、ルールが異なります。

故に用途も異なります。

【GET】

「GET」は情報(リソース)に変化があってはいけません。

そして、1回目、2回目、3回目のアクセスでも情報(リソース)に変化が無い限り全く同じ情報が返される必要があります。裏を返すとクライアント(利用者側)はリクエストに失敗したら、気軽にリトライして良い訳です。

Quoraで例えると「回答の投稿ボタン」を押すとデータベースに回答が登録される訳ですが、これは情報に変化があるためGETではいけません。

質問を見る分には質問や回答に変更は発生しませんので、GETで良い訳です。

用途としては、「表示」「検索」です。

ちなみに、ブラウザのアドレスバーに直接入力をしてエンターキーを押した時のリクエストはGETです。

【POST】

「POST」は何をしてもOKです。

POSTリクエストで情報を表示、登録、変更、削除、何をしても許されます。

しかし、クライアント(利用者側)から見るとPOSTメソッドは安全(情報[リソース]に変更を与えない)である事が約束されていないため、気軽にリクエストする事はできません。2回リクエストすれば情報(リソース)が2個作られてもそれはクライアントの責任です。

ブラウザでページを更新した時や戻った時に「本当にこのフォームを再送

… (もっと読む)
石塚 正浩さんのプロフィール写真

そもそも猿が分かるほどは違いがないからな。。

用途で分けてみますか。

GET: URL("http://example.com?a=b&c=d")だけで情報を取得出来る。
POST: 長ーいデータをブラウザから送信するときに使用する。

GETは、リクエストを短くしてデータを欲しい場合に使用します。URLに情報を全部詰めます。

URLには長さ制限がある(8092バイト)ので、その意味でも短くなります。つまりどういうデータが欲しいかの条件をつけない、比較的な単純なデータを取得するときに使用します。

POSTは、リクエストがやたら長いデータを欲しい場合に使用します。

POSTは原理上ブラウザからの上限がありません。HTTPリクエストボディに長く付与出来ます。とはいえ、あまりに長いとサーバが受け付けない可能性はあります。

実際にはリクエストというより、大きいひとかたまりのデータを送信する場合に使用します。画像ファイル一個送ったりとか、PDFファイル送ったりとか。

ということで、用途的には、GET: 単純なリクエスト、POST: 複雑なリクエストのときに使用します。

ちなみに戻ってくるデータ(レスポンス)はどちらも同じな場合があります。GETとPOSTの区別はあくまでリクエスト側(ブラウザ側)だけです。

0 コメント:

コメントを投稿