【Webエンジニアの求人なのに】Day1.GETとPOSTの違い


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に記載するメソッド名を判断する(判断するというか基本的な考え方に沿って選択する)というような感じでしょうか。

他の参考サイト

railsにおけるgetとpostの違い

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を使用します。

最後に

初心者なりにまとめてみましたがいかがでしたでしょうか。
間違っているところがあったらご指摘ください。
次回は「公開鍵暗号を知らない」をまとめたいと思います。