RailsとSwiftでAPI通信を行うブログアプリを作る。 〜API編〜

## はじめに

Rails × APIの簡単なサンプルでちょうど良いのがないのと、肝心なところが省略されていたりしたので、超絶優しくサンプルを解説します。

対象となるのは、RailsでAPI作ってSwiftで操作するアプリケーションを触ってみたい方です。
Rails5から標準搭載となったAPIモードが素晴らしいので、APIモードを使ってサクッとAPI作ってSwift側で受け取って流れを掴んでみたいという方向けとなっています。

## 環境

* Ruby 2.4
* Rails 5.1.4

## APIモードでnewする

`rails new アプリケーション名 --api`でAPIモードでアプリを作成できる
今回は取り敢えず、`blog_api`という名前のapiを作成する

```
// apiモードで作成
$ rails new blog_api --api

// blog_apiディレクトリに移動
$ cd blog_api
```

## scaffoldを実行

APIモードで作成したら、scaffoldで適当なCRUD機能を作る

```
// ブログ機能をscaffoldで作成
$ rails g scaffold Blog title:string body:text

// マイグレーションを実行
$ rails db:migrate
```

APIモードでscaffoldを実行すると、views以下にテンプレートは作成されず、
* app/controllers/blogs_controller.rb
* app/models/blog.rb

以上が生成される。

中身はこのような感じ

```ruby
# app/controllers/blogs_controller.rb
class BlogsController < ApplicationController
  before_action :set_blog, only: [:show, :update, :destroy]

  # GET /blogs
  def index
    @blogs = Blog.all

    render json: @blogs
  end

  # GET /blogs/1
  def show
    render json: @blog
  end

  # POST /blogs
  def create
    @blog = Blog.new(blog_params)

    if @blog.save
      render json: @blog, status: :created, location: @blog
    else
      render json: @blog.errors, status: :unprocessable_entity
    end
  end

  # PATCH/PUT /blogs/1
  def update
    if @blog.update(blog_params)
      render json: @blog
    else
      render json: @blog.errors, status: :unprocessable_entity
    end
  end

  # DELETE /blogs/1
  def destroy
    @blog.destroy
  end

  private
    # Use callbacks to share common setup or constraints between actions.
    def set_blog
      @blog = Blog.find(params[:id])
    end

    # Only allow a trusted parameter "white list" through.
    def blog_params
      params.require(:blog).permit(:title, :body)
    end
end
```

```ruby
# app/models/blog.rb
class Blog < ApplicationRecord
end
```

上記のようにcontrollerはjsonで返すように自動で処理が書かれる。（素晴らしすぎる）

## URIパターンを確認する

`rails routes`で定義されているURIパターンを確認します。

Prefix | Verb | URI Pattern | Controller#Action | 用途
-------| ---- | ----------- | ----------------- | ----
blogs| GET | /blogs(.:format) | blogs#index | 全てのレコードを取得するjsonを返す
 | POST | /blogs(.:format) | blogs#create | レコードを作成
blog | GET | /blogs/:id(.:format) | blogs#show | URIで渡ってきたidのレコードを返す
 | PATCH | /blogs/:id(.:format) | blogs#update | URIで渡ってきたidのレコードを更新
 | PUT | /blogs/:id(.:format) | blogs#update | URIで渡ってきたidのレコードを更新
 | DELETE | /blogs/:id(.:format) | blogs#destroy | URIで渡ってきたidのレコードを削除

## APIを操作してみる

APIの確認とか操作をコマンドラインからやってもいいのだけど、以下の二つが便利過ぎるので、以下を使いましょう。
* [Postman](https://www.getpostman.com/)
* [JSON Viewr](https://chrome.google.com/webstore/detail/json-viewer/gbmdgpbipfallnflgajpaliibnhdgobh)

> 上記二つの詳細な使い方は割愛します。

`rails s`でサーバーを起動して、[http://localhost:3000/blogs](http://localhost:3000/blogs)を確認する。

![スクリーンショット 2018-01-23 11.15.39.png](https://qiita-image-store.s3.amazonaws.com/0/19716/b30c99a1-878d-8e4c-ef74-44a24c0148de.png)

JSON Viewrを入れていれば、以上のようになるかと思う。

### Postmanでレコードを作成する

Postmanを起動して、以下のようにしましょう。
HTTPメソッドをPOSTにして、URL入力欄に、`http://localhost:3000/blogs`といれて、下のタブから「Headers」を選択し、以下二つを入力

Key | Value | Description
--- | ----- | -----------
Accept | application/json | 
Content-Type | application/json | 

![スクリーンショット 2018-01-23 11.18.36.png](https://qiita-image-store.s3.amazonaws.com/0/19716/488b258c-93a7-98de-b31a-23c3acdb94a5.png)

上記入力後、タブを「Body」に変更し、その下のradioボタンを「row」にし以下を入力

```json
{
  "blog": {
    "title": "RailsとSwiftでAPI通信を行うブログアプリを作成",
    "body": "何書こうかな"
  }
}
```

入力し、右上のSendボタンを送るとレコードが作成される。

![スクリーンショット 2018-01-23 11.29.55.png](https://qiita-image-store.s3.amazonaws.com/0/19716/45ebc863-2e4e-73ec-2d74-2c4b8cc32fb4.png)

レコードが作成出来たら、ブラウザで[http://localhost:3000/blogs](http://localhost:3000/blogs)にアクセスをしてみましょう
すると以下のようにレコードが追加されているのがわかるかと思います。

![スクリーンショット 2018-01-23 11.33.16.png](https://qiita-image-store.s3.amazonaws.com/0/19716/0fa0424f-cd89-9fb6-728f-5770371aa735.png)

### Postmanでレコードを更新する

レコードの更新にはHTTPメソッドの`PUT`を使います。
PostmanでHTTPメソッドを`PUT`にし、URLを`http://localhost:3000/blogs/1`とし、bodyを以下のように書き換えます。

```json
{
	"blog": {
		"title": "RailsとSwiftでAPI通信を行うブログアプリを作る",
		"body": "API楽しい"
	}
}
```

![スクリーンショット 2018-01-23 11.37.24.png](https://qiita-image-store.s3.amazonaws.com/0/19716/ba43f598-22e9-41c4-0084-1dd9e7eef950.png)

上記でレコードが更新されたのがわかるかと思います。
ブラウザを確認しましょう。[http://localhost:3000/blogs/1](http://localhost:3000/blogs/1)

![スクリーンショット 2018-01-23 11.41.53.png](https://qiita-image-store.s3.amazonaws.com/0/19716/48078f49-2d75-2285-1717-a3211c90279a.png)

## Postmanでレコードを削除する

最後に削除を行いましょう。
PostmanのHTTPメソッドを`DELETE`に変え、URLを`http://localhost:3000/blogs/1`にしてsendを押すだけです。

![スクリーンショット 2018-01-23 11.43.41.png](https://qiita-image-store.s3.amazonaws.com/0/19716/1a30dd6a-ba0d-ba4b-6d75-36728b9fdcbf.png)

ブラウザにアクセスをしましょう[https://localhost:3000/blogs](https://localhost:3000/blogs)

![スクリーンショット 2018-01-23 11.46.15.png](https://qiita-image-store.s3.amazonaws.com/0/19716/33c52497-8d21-e2ba-487c-fb39e7740fd2.png)

先ほどのレコードはないので、当然[https://localhost:3000/blogs/1](https://localhost:3000/blogs/1)にアクセスをするとエラーとなります。

以上でAPI編は終わりです。
次はSwiftでこちらのAPIを操作出来るようにしたいと思います