【3分で出来る】Ruby on RailsでWeb APIの作成

この記事では、Ruby on RailsにおけるAPIの作り方を簡単に紹介します。

Rails が非常に優秀なので作成は3分もあればできます。（Rails を使う環境が整っている前提）

データベースへのユーザ登録、参照、消去、更新ができるAPIを作成し、いじりながら解説します。

この記事では、Ruby on RailsにおけるAPIの作り方の最も基礎を簡単に紹介します。今後の記事でもっと詳細に解説をしていく予定です。

Railsが非常に優秀なのでAPIの作成は3分もあればできます。（Rails を使う環境が整っている前提）

データベースへの登録・参照・消去・更新ができるAPIを作成し、いじりながら解説します。

詳しい中身の解説は以下の記事で。
[【Ruby on Rails】Web APIの作り方を詳しく解説！](https://qiita.com/ruemura3/items/da5beff64f1c2e966a05)

# 前提知識
- APIとは
- JSON
- HTTPリクエスト、レスポンス
- GET, POST, DELETE, etc…

# 環境
- ruby 2.6.5
- Rails 6.0.2
- macOS Catalina 10.15.3
 
# 作り方
登録・参照・消去・更新ができるAPIを作成しましょう。速攻で終わります。

## 1. まずはAPIの基盤作成
RailsApiという名前で作ることにしましょう。

```
$ rails new RailsApi --api
```

ご存知の通りrails new [アプリ名]とすることでアプリの基盤を作成することができますが、 **--apiのオプションをつけることでAPIに必要なものだけに絞って**作ってくれます。viewとかが作られません。

以下の画像を見ると明らかにAPIの方がサイズが小さいことが分かります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574728/2a69d664-1603-4374-4459-aac3bfacbcaf.png)


## 2. RailsApiフォルダに移動。

```
$ cd RailsApi
```

## 3. scaffoldを使ってモデルやコントローラなど一括作成。

```
$ rails g scaffold user user_id:string password:string
```

`rails g( or generate) scaffold [モデル名（単数形）] カラム名:データ型 (カラム名:データ型...)`
今回はユーザテーブルにIDとパスワードを持たせようと思うのでこの様に指定しました。IDのカラム名をidとしない様に注意。（自動生成されるカラム名のidと被るため）

## 4. データベースの作成とテーブルの作成

```
$ rails db:create
$ rails db:migrate
```

そしてなんと、、、**これでAPIの完成**です。（マジ）

詳しくはあとで解説するとしてこのAPIを試してみましょう。

# 作成したAPIを試す
まず、APIをいじるならhttpリクエスト送信とレスポンス受信ができるツールが必要なので、chromeの拡張機能である[Advanced REST client](https://chrome.google.com/webstore/detail/advanced-rest-client/hgmloofddffdnphfgcellkdfbfbjeloo?hl=ja)をダウンロードしておきましょう。

（ブラウザにURLを入力するとGETリクエストになるのでGETリクエストだけならブラウザさえあればOKです。）

## 全件取得

```
$ rails s
```

上記コマンドでローカルサーバを起動し、http://localhost:3000/users/ へGETリクエストを送ってみましょう。これは「データの全件取得」を意味します。（rails g scaffold user ~でuserのモデルを作成したためその複数形をパスに指定。）

すると以下の様な空のレスポンスが返ってきます。これはまだデータ投入していないからです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574728/a4aa54bc-fd58-518f-dd04-5df455a19d1d.png)

## データ投入
ではデータ投入しましょう。

~/users/へ**POST**リクエストを送ります。これは「bodyのjsonを元にデータを作成する」ことを意味します。その際に、リクエストのBodyを以下の様に指定しましょう。

```
Body content type : application/json
Body : {"user_id":"hoge","password":"fuga"}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574728/978de867-2569-5ad9-dcfb-64e59fe3906f.png)

すると以下の様なレスポンスが返ってきてユーザが作られたことが分かります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574728/4d5a68ba-a8e0-c2f3-ba62-c2f7b18d1cb8.png)

ついでにもう１つデータ投入しておきましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574728/abb089f1-27fc-7c73-133d-6c745df90358.png)



この状態で~/users/へGETリクエストを送ると、、、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574728/0df59725-ef5b-d68f-587e-9c46930f91a7.png)


先ほど入れた2件のデータが両方取れます。

## 1件取得
次は、~/users/2へ**GET**リクエストを送ってみましょう。これは「idが2である人のデータを取得する」ことを意味しており、以下の様なレスポンスが返ってきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574728/d84b3c89-be8f-9710-707b-d659eec89f6f.png)

## 削除
次は、~/users/2へ**DELETE**リクエストを送ってみましょう。これは「idが2である人のデータを削除する」ことを意味しており、以下の様なレスポンスが返ってきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574728/3303d0ce-ec0f-52d4-4c8a-d77dbbda4e88.png)

この状態で~/users/へGETリクエストを送ると、、、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574728/c871188d-0436-d2ce-da15-63b1265fccb2.png)

idが2のデータがなくなっていることがわかります。

# 更新
最後に、~/users/1へ**PATCH**リクエスト(PUTでも可)を送ってみましょう。これは「bodyのjsonを元にidが1であるデータを更新する」ことを意味します。その際に、リクエストのBodyを以下の様に指定しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574728/b92abe85-7109-53c5-ff8b-caae1577b5d5.png)

すると以下の様なレスポンスが返ってきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574728/86a9d311-7726-5fdd-0a5a-134fcb612d9d.png)

idが1のデータのuser_idがhogehogeに変更されているのがわかると思います。

メソッドとパスその効果をまとめると以下の様になります。

|メソッド|パス<br>http://localhost:3000/の続き|効果|
|:---|:---|:---|
|GET|users|全件取得|
|POST|users|bodyのjsonでデータ投入|
|GET|users/:id|該当idのデータを取得|
|PATCH/PUT|users/:id|該当idのデータをbodyのjsonで更新|
|DELETE|users/:id|該当idのデータを削除|

# ソースコード
https://github.com/ruemura3/RailsApi

# さいごに
理解するには自分でやってみるのが一番なので自分で作ってみてください。ユーザのAPIができたら記事投稿のAPIなんかも作ってみるといいと思います。

この世にある「iPhoneのアプリからもiPadのアプリからもパソコンのブラウザからも使えるようなアプリケーションはすべてAPIを使ってデータ管理をしています。
バックエンドエンジニアには必須の知識ですね。

今回作成したAPIの中身詳細解説は以下の記事で行っています。
[【Ruby on Rails】Web APIの作り方を詳しく解説！](https://qiita.com/ruemura3/items/da5beff64f1c2e966a05)

質問などございましたら遠慮なくTwitterやコメントまで！[Twitter@ruemura3](https://twitter.com/ruemura3)