##Webエンジニアの求人なのに
先日Twitterでこんなツイートを見つけました。
実際私は全く理解していません。
知ってて当たり前のことなのかなと思いましたので、これから一つ一つ記事にして整理したいと思います。
##day1.POSTとGETの違い
今日はPOSTとGETの違いについて理解したいと思います。
まずは、railsの教科書から引用します。
HTTPメソッドのPOSTは今回のようなデータの新規作成時に使います。そのほか、サーバの状態へ何らかの変更を与える場合にはこのPOSTを利用します。indexやnewの時に利用したHTTPメソッドGETは、サーバの状態に変更を与えない場合に使います。newアクションでは新規入力画面を表示するだけでまだデータを保存しないので、HTTPメソッドはGETを使うのです。
サーバの状態に変更を与えるっていうのは何等かのデータを保存するとかそういうことでしょうか。
POSTを利用するとどのようなことが起きるのでしょうか。
(例)新たなbooksの情報を登録する(railsの教科書Createアクションから引用)
http://localhost:3000/books
にアクセスすると、/books へのPOSTなので、booksコントローラのcreateアクションが呼び出される。
HTTP Verb | Path | Controller#Action |
---|---|---|
POST | /books(:format) | books#create |
①routes.rbでの処理
routes.rbにはこのようにコードが記載されている。booksコントローラのcreateメソッドでの処理が行われるように記載されている。
(略)
post '/books', to: 'books#create'
(略)
②booksコントローラでの処理
booksコントローラで本のデータを作るsaveメソッドにより本のデータ登録が成功すればshow画面に遷移する。
データの登録の際は、ブラウザがユーザーの入力データをパラメータとして受け取り、本のデータを作っている。
(例)app/controllers/books_controller.rb
def create
@book = Book.new(book_params)
respond_to do |format|
if @book.save
format.html { redirect_to @book, notice: 'Book was successfully created.' }
format.json { render :show, status: :created, location: @book }
else
format.html { render :new }
format.json { render json: @book.errors, status: :unprocessable_entity }
end
end
end
③データを受け取り、データの値を保存したことから、データの情報が変更される。→HTTPメソッドは、POSTメソッドを利用する理由
私のイメージですが、**POSTやGETが何か役割を持つというよりも、まずデータベースに変更を与えるか否かでどちらのメソッドを使うべきか判断し、routes.rbに記載するメソッド名を判断する(判断するというか基本的な考え方に沿って選択する)**というような感じでしょうか。
##他の参考サイト
getはデータベースを変更しないアクション
postはデータベースを変更するアクション
わかりやすい!
GETとPOSTの違いについてより引用すると、
1 使用用途が違うこと
GETはなにかを取得するときに使うべきものです。POSTはなにかを新しく登録するときに使うものです。
これもわかりやすい!
2 リクエストの送り方が違う
サーバへのリクエストの送り方が違う、と言う話です。
GETはURLに付加してリクエストします
GET: /foo/bar?p=........&u=.........
POSTはBodyに含めてリクエストします。
POST: /foo/bar
param:p:...........,u.........
GETはURLに直接付加するので目でパラメータを見ることができます。
POSTはBodyに含めるので目で見ることはできません。
後はバイナリで送れるのとか、サイズ制限があるのとか、GETとPOSTでリクエストする際の仕様が異なっています。
恐らく、最も分かりやすい違いだと思います。
なんとなくわかる…
こちらgetメソッドとpostメソッドの違いとSEO面からの使い分けのサイトも同様のことが記載されていました。
getメソッド、postメソッドとは
getメソッドとpostメソッドのそれぞれを説明するよりも、違いから入ったほうが理解しやすいです。
違いというのは、getメソッドではリスエストした内容に応じてURLが変わりますが、postメソッドではURLが変わりません。
ユーザーがページをリクエストする際のHTTPに関して基本をおさらいしておきましょう。
HTTPというのは、クライアント(データ受信)とサーバー(データ送信)で情報のやりとりをする際に使われるルール(プロトコル)です。
データのやりとりは「リクエスト」→「解析処理」→「レスポンス」という流れで行われ、この時にメソッドが必要になります。
getメソッドとpostメソッドの技術的な違いは、以下の通りです。
・get:パラメーターをURLに組み込む
・post:パラメーターをリクエストボディに組み込む
たとえば物件検索サイトなどで、条件に合った物件を探したい場合を想定してみてください。
間取りや家賃などの条件を入力した場合に、検索結果ページのURLに入力した条件が含まれるような場合はgetメソッドです。
一方で、条件がリクエストボディ内に含まれるため、どのような条件を入力してもURLが変わらないのがpostメソッドです。
一方で、条件がリクエストボディ内に含まれるため、どのような条件を入力してもURLが変わらないのがpostメソッドです。
http://example.com/search.php
getメソッドの?以降についている部分はURLパラメータと呼ばれます。
##回答
ここまでを整理して回答を考えてみました。
問 HTTPメソッドのGETとPOSTの違いとは
答 GETとPOSTの違いはデータベースに変更を加えるか否かの違いがあります。例えば、既存のデータを受け取りたいときはGETを使用します。一方、ブラウザがデータを受け取り、それらを保存する場合は、データベースに変更を与えるためPOSTを使用します。
##最後に
初心者なりにまとめてみましたがいかがでしたでしょうか。
間違っているところがあったらご指摘ください。
次回は「公開鍵暗号を知らない」をまとめたいと思います。