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


##Webエンジニアの求人なのに
先日Twitterでこんなツイートを見つけました。

![3551F8E9-7F7E-4375-B809-9ACF4302652D[373].png](https://qiita-image-store.s3.amazonaws.com/0/256858/911bd2eb-1b09-bf1a-a108-24bcc4a6e2b8.png)


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


##day1.POSTとGETの違い

今日はPOSTとGETの違いについて理解したいと思います。
まずは、[railsの教科書](http://igarashikuniaki.net/rails_textbook/new-create.html)から引用します。

>HTTPメソッドのPOSTは今回のようなデータの新規作成時に使います。そのほか、サーバの状態へ何らかの変更を与える場合にはこのPOSTを利用します。indexやnewの時に利用したHTTPメソッドGETは、サーバの状態に変更を与えない場合に使います。newアクションでは新規入力画面を表示するだけでまだデータを保存しないので、HTTPメソッドはGETを使うのです。


サーバの状態に変更を与えるっていうのは何等かのデータを保存するとかそういうことでしょうか。
POSTを利用するとどのようなことが起きるのでしょうか。

（例）新たなbooksの情報を登録する（[railsの教科書Createアクション](http://igarashikuniaki.net/rails_textbook/new-create.html)から引用）

http://localhost:3000/books
にアクセスすると、/books へのPOSTなので、booksコントローラのcreateアクションが呼び出される。

| HTTP Verb    |      Path            |   Controller#Action    |
|:-------------|--------------------:|:----------------------:|
| POST         |     /books(:format) |      books#create      |



①routes.rbでの処理
routes.rbにはこのようにコードが記載されている。booksコントローラのcreateメソッドでの処理が行われるように記載されている。

```rb
（略）

post '/books',  to: 'books#create'

（略）
```

②booksコントローラでの処理
booksコントローラで本のデータを作るsaveメソッドにより本のデータ登録が成功すればshow画面に遷移する。
データの登録の際は、ブラウザがユーザーの入力データをパラメータとして受け取り、本のデータを作っている。

（例）app/controllers/books_controller.rb

```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の違い](https://qiita.com/you8/items/99ce594dd0492647a45c)

>getはデータベースを変更しないアクション
postはデータベースを変更するアクション


わかりやすい！



[GETとPOSTの違いについて](https://qiita.com/kanataxa/items/522efb74421255f0e0a1)より引用すると、
１　使用用途が違うこと

>GETはなにかを取得するときに使うべきものです。POSTはなにかを新しく登録するときに使うものです。

これもわかりやすい！

２　リクエストの送り方が違う

>サーバへのリクエストの送り方が違う、と言う話です。
GETはURLに付加してリクエストします
GET: /foo/bar?p=........&u=.........
POSTはBodyに含めてリクエストします。
POST: /foo/bar
param:p:...........,u.........
GETはURLに直接付加するので目でパラメータを見ることができます。
POSTはBodyに含めるので目で見ることはできません。
後はバイナリで送れるのとか、サイズ制限があるのとか、GETとPOSTでリクエストする際の仕様が異なっています。
恐らく、最も分かりやすい違いだと思います。


なんとなくわかる…


こちら[getメソッドとpostメソッドの違いとSEO面からの使い分け](https://www.sakurasaku-labo.jp/blogs/seo-get-post)のサイトも同様のことが記載されていました。

>getメソッド、postメソッドとは
getメソッドとpostメソッドのそれぞれを説明するよりも、違いから入ったほうが理解しやすいです。
違いというのは、getメソッドではリスエストした内容に応じてURLが変わりますが、postメソッドではURLが変わりません。
ユーザーがページをリクエストする際のHTTPに関して基本をおさらいしておきましょう。
HTTPというのは、クライアント（データ受信）とサーバー（データ送信）で情報のやりとりをする際に使われるルール（プロトコル）です。
データのやりとりは「リクエスト」→「解析処理」→「レスポンス」という流れで行われ、この時にメソッドが必要になります。

>getメソッドとpostメソッドの技術的な違いは、以下の通りです。
・get：パラメーターをURLに組み込む
・post：パラメーターをリクエストボディに組み込む

>たとえば物件検索サイトなどで、条件に合った物件を探したい場合を想定してみてください。
間取りや家賃などの条件を入力した場合に、検索結果ページのURLに入力した条件が含まれるような場合はgetメソッドです。

http://example.com/search.php?madori=2ldk&yachin=80000

>一方で、条件がリクエストボディ内に含まれるため、どのような条件を入力してもURLが変わらないのがpostメソッドです。

>一方で、条件がリクエストボディ内に含まれるため、どのような条件を入力してもURLが変わらないのがpostメソッドです。
http://example.com/search.php
getメソッドの？以降についている部分はURLパラメータと呼ばれます。


##回答

ここまでを整理して回答を考えてみました。

問　HTTPメソッドのGETとPOSTの違いとは

答　GETとPOSTの違いはデータベースに変更を加えるか否かの違いがあります。例えば、既存のデータを受け取りたいときはGETを使用します。一方、ブラウザがデータを受け取り、それらを保存する場合は、データベースに変更を与えるためPOSTを使用します。

##最後に

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