6
7

More than 5 years have passed since last update.

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

Posted at

Webエンジニアの求人なのに

先日Twitterでこんなツイートを見つけました。

3551F8E9-7F7E-4375-B809-9ACF4302652D[373].png

実際私は全く理解していません。
知ってて当たり前のことなのかなと思いましたので、これから一つ一つ記事にして整理したいと思います。

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

最後に

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

6
7
6

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
7