初心者がRESTを学ぶ【基礎編】(´･ω･`)

#この記事について
 

■ 対象：<font color="DeepSkyBlue">**IT初心者しょぼん君：**</font color>(´･ω･`)
・初心者向け、イメージを掴むキッカケになることが目的の記事
・砕いた理解で、一部正確ではない場合があります。

■ しょぼん君のぼやき
<font color="DeepSkyBlue">**しょぼん君：**</font color>(´･ω･`)『Restってよく聞くよね』


#RESTとは
チームで会話していると「RESTで ~...」などと耳にしたことがあるかもしれませんが。RESTとは設計原則、モデルです。

もう少し砕いた言い方をすると、型です。
食パンの型に生地を入れて焼くから食パンと呼ぶように、RESTの型で作成したAPIが、RESTful APIと呼ばれています。

<font color="DeepSkyBlue">**しょぼん君：**</font color>(´･ω･`)『みんなRESTで〜、、と言うけどね』

RESTの設計原則としては、以下4つがよく紹介されます。

>1.セッションなど、状態管理を行わず、やり取りされる情報はそれ自体で完結して解釈することができること
2.HTTPメソッドなど、情報を操作する命令の体系が予め定義・共有されていること
3.すべての情報は、汎URLなどの汎用的な構文で一意に識別されること
4.情報の一部として、HTMLなど別の状態や別の情報への参照を含めることができること

実際にRESTのAPIを見てみましょう。
そもそもAPIってなんぞや。という話は少し本質と逸れるので、ここでは、パシリぐらいに思っておきましょう。

<font color="DeepSkyBlue">**しょぼん君：**</font color>(´･ω･`)『焼きそばパン買ってこいよぉ〜』

例えばQiitaのAPIを例にしますが、ブラウザから以下のURLにアクセスすることでリクエストしたデータを確認することが出来ます。
https://qiita.com/api/v2/items?page=1&per_page=2


これはAPI（パシリ）に、データを取ってくるようにブラウザ側から依頼ししたことになりますが
上の4つの設計原則に当てはめていうと、Qiitaのサーバー上にある情報を、URLなどの汎用的な構文で一意に識別し、あらかじめ操作する命令が定義されているHTTPSメソッドで状態管理などは行わずに、データを取得した。という具合ことになります。


<font color="DeepSkyBlue">**しょぼん君：**</font color>(´･ω･`)『URLの先頭ではプロトコルを指定しているのだね。』

##HTTP/HTTPS

実際に、ブラウザでどんなことが行われるのか確認してみます。

せっかくなので、今回はcurlコマンドの練習もしてみます。
ブラウザでやっていることと変わらず、画面で表示を確認するかターミナルで確認するかという違いです。curlコマンドはターミナルから実行して、サーバとのデータ転送を行うコマンドです。データをターミナルに表示させます。

先ほどと同じURL (https://qiita.com/api/v2/items?page=1&per_page=2) をcurlで取得してみましょう。同じ結果が得られるはずです。


```curlコマンド.
$ curl -X GET -v https://qiita.com/api/v2/items?page=1&per_page=2
```

オプション説明
-X：明示的にリクエストメソッドを指定。今回はGETメソッドを指定しています。
-v：HTTP通信の詳細を出力。デバック

<font color="DeepSkyBlue">**しょぼん君：**</font color>(´･ω･`)『ほぉー、じゃあブラウザでもメソッドを指定していたの？』

メソッドには GET や POST などがありますが、ブラウザから取得した際も、実はURLは GET https://qiita.com/api/v2/items?page=1&per_page=2 となっていました。

これは、ブラウザの開発者ツールでも確認することが出来ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147613/02f52b81-3a23-1ff4-7a75-dba873023883.png)

###HTTP と HTTPS

このように、URLの戦闘ではプロトコルを指定しています。
社内ページなどでは、http://から始めるページも目にすることもあるかと思いますが、これらの主な違いは 通信が暗号化されているかどうか です。

http://から始まるWEBサイトは暗号化されておらず、https://から始まるWEBサイトは暗号化されて通信しています。

例えば、サイトにログインする際にパスワードなどを入力するとして、暗号化されていないHTTPメソッドでは、送信情報がむき出しのまま通信の中を歩き回ってしまうことになります。これでは危険なので、暗号化された通信ではそれらを、すぐには特定できないように変換しています。

<font color="DeepSkyBlue">**しょぼん君：**</font color>(´･ω･`)『暗号化されているから安心。という訳ではないけど、一つの確認ポイントではあるね』



##PathパラメーターとQueryパラメーター

<font color="DeepSkyBlue">**しょぼん君：**</font color>(´･ω･`)『RESTful API ではプロトコルとメソッドを指定して、データのやり取りを行なっていることはわかった。URLの後ろのゴニョゴニョはなんなの。』

後ろで指定しているものはパラメーターで、PathパラメーターとQueryパラメーターの2種類があります。

先ほどから例にしているこちらのURL https://qiita.com/api/v2/items?page=1&per_page=2 ですが、この構成を見てみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147613/8029bf60-97af-abc4-11d7-c66fabc7469e.png)


Pathパラメーター
の部分では、取得対象を識別するために必要な情報を指定します。
<font color="DeepSkyBlue">**しょぼん君：**</font color>(´･ω･`)『itemsから探してくださーい！と対象を指定していて』


Queryパラメーター
の部分では、取得対象を操作する際に必要な情報を指定します。上の例では、ページ番号を表すpageパラメータと、1ページあたりに含まれる要素数を表すper_pageパラメーターを指定しています。Queryパラメータを複数指定する際は & を用います。

<font color="DeepSkyBlue">**しょぼん君：**</font color>(´･ω･`)『ページは1で、要素の数は2個でおなしゃす！という条件で絞り込んでいるのだな』


ここまでで RESTful API がどういったもので、どう利用するのかを見てきました。
基本編はここまでです。RESTful API を利用するコーディングでは上記のような形でデータを取得し活用します。


〜 END ~