API開発の効率化の架け橋！APIのStubサーバーを導入して,API開発に効率化、スピード化、柔軟性を手に入れよう！

by @mixiappwchr

みなさんアプリ開発を行うときは,アプリエンジニアとサーバーサイドエンジニアと一緒にAPIをどのように作っているかと思います。
お互いの合意を取りながら、仕様を決めても、それからすぐにAPIが完成して出てくるわけではありません。
また、ある程度仕様が緩い段階で、一回アプリを作ってみたいと思うのは普通です。

その時アプリエンジニアのみなさんはとりあえずJSONを作って動かしていたり、簡易的にレスポンスを返してもらうようにサーバーサイドにお願いしているかとおもいます。
ただその方法だと、JSON作るにしても一部レスポンスだけスタティックなJSONを読みに行くのはちょっと面倒だったり、サーバーサイド側にお願いするにも、ちょっと変更したい場合はデータをいじりたい場合に、いちいちお願いしていると時間がかかってしまいます。

私自身はサーバーサイドも書くため、いろいろ手段がとれるのですが、完全にそれぞれ分業だとなかなかやりづらいかたも多かったり、私もサーバーサイドまでは見ない案件だと、サーバー側のコードはなかなか手を入れづらい状況があります。


そこで比較的おすすめなフローとして、APIサーバーの間にstubとして動くサーバーの導入をおすすめします。



# APIのstub serverを使う

今回紹介するstub serverの基本的な機能として

* stubするリクエスト以外は実際のサーバーにリクエストを向けてくれるプロキシとなる
* json5でかけるので、生のjsonより記述が楽
* 実際のサーバーへのリクエストをstub化して再利用できる

ということができます。

これらのstubサーバーを導入することで

* 実際のサーバーのレスポンスと混在させることができるので、扱いがらく
* 実際のサーバー側をいじることなくレスポンスをいじれるのでアプリエンジニアが触ってもサーバーサイドエンジニアが用意する場合も影響を与えない
* 実際のサーバーのレスポンスを活用できるため、stubを作ることができる。

といった風にサーバーサイドエンジニアとアプリエンジニアともに分業がよりしやすくなる利点が生まれます。

# Stub serverの紹介
今回紹介するのはstub serverを導入するきっかけとなった @yosuke-furukawa さんが作った
stubcellというstub serverです。上記紹介した機能を持ち合わせていて、非常に便利です。RESTやJSONRPCにも対応しています。

## Stubcell
https://github.com/yosuke-furukawa/stubcell

stubcellについては下記を参考にしてください。

[stubcellを使ってみた](http://qiita.com/unhappychoice/items/b5fadf7e9c7042f69f45)


## API Stub Server

もう一つはライブラリ化はしてないのですが、stubcellにインスパイアされて私が作ったsinatraベースのアプリです。railsの案件のために作ったのでRESTだけの対応になります。

https://github.com/nyankichi820/stubsever


クライアント開発に置いてAPI連携部分の実装を楽にするためのスタブサーバーです。

* responseをローカルのjson fileを指定して返せる
* stubしない物はproxyサーバーになり、別サーバー（例えば本番サーバー）へリクエストを飛ばします。
* proxyリクエストは自動的にjson fileにおちるので、そのままテストデータに使えます。
* APIの仕様管理を簡易的に行えます。

### Install

stub server のみ
```
cd stub
bundle install
```

stub 管理 web serverも使う場合はgrunt,sass,bowerなどが必要になります。

```
npm install 
grunt 
```


### Usage

#### run server 

```
bundle exec rackup -p 3000
```

#### setup stub reqsponse 

config/fixture.ymlにstubしたいリクエストの設定を書くことでjsonを返すことができます。

*例: http://xxxx/topにリクエストが来たらstub/fixtures/top.jsonをかえす*

```
  - route: /stub/sample
    route_sample: /stub/sample
    description : stubサンプル
    file : sample
```

またさらに別サーバーへのリクエストをプロキシすることも可能です。

*例: http://xxxx/topにリクエストが来たらhttp://zzzzzzz/topの内容ををかえす*

```
  - route: /stub/sample
    route_sample: /stub/sample
    description : stubサンプル
    url  : http://zzzzzzz/top
```


返すJSONはjson5対応してあるためコメント、keyに対する"の省略などが可能です

```
{
  // comment かける！
  response: {
    // quote いらない！！
    title : "タイトル",
    // 下記のような記述で定義からサンプルデータを読み込めます
    lists : <%= fixture("lists_sample") %>
  }, // ケツカンマおっけ
  // fakerでのサンプルの作成が可能です
  user : {
    name : "<%= Faker::Japanese::Name.name %>",
  },
  post : {
    title : "<%= Faker::Lorem.sentence(3) %>",
    body : "<%= Faker::Lorem.sentence(20) %>",
  }
}
```

#### describe definition
APIの仕様を簡易的に管理するための機能を持ち合わせています。
管理用のWeb Serverから記述した内容を確認することができます。
カテゴリごとに記述が可能です

```
definitions:
  - description: API Common
    fixtures:
      - route: /stub/common/response
        route_sample: /stub/common/response
        description : API共通フォーマット
        file : entity/user
  - description: Entities
    fixtures:
      - route: /stub/entity/user
        route_sample: /stub/entity/user
        description : Userエンティティ
        file : entity/user
```

さらにこの定義をfixture側からincludeする形で呼び出すことが
できるため、メンテナンスもしやすいです。


#### request recording
stubしないリクエストは直接ORIGIN_URLに指定したサーバーへリクエストを送り
/tmp/stub_record/以下にresponseを保存します。
これらのファイルをcopyして再利用することにより,stubデータに使用できます。

このアプリはサクッと間に合わせで作ったので簡単な作りになってますのでいろいろカスタマイズしてみるのも良いかと思います。

そしてどなたか僕のクソ実装ではなくて、ruby実装で素敵なstub serverがあれば教えてください！

# 終わりに

アプリ開発においては、いかに分業を効率よく進めるかが肝になります。このようにうまく並行作業を行いやすい仕組みなどを導入することで工夫できることも多くありますので皆さんもいろいろ普段からやっている効率化をいろんな場面で検討するとよりスピードアップが図れると思います。

皆さんもアプリ開発を効率良く進めていきましょう！


##### appwchr post
----

[Goodbye... Jenkins... Jenkinsを卒業してお手軽CI! iOSもAndroidもCircle CIでアプリのCIを回そう](http://qiita.com/appwatcher/items/4cdf39804d6e46ab7af5)

[まだTestFlight使ってたの？急げ！終了目前のTestFlightから,今すぐにiOSもDeployGateに移行しよう！移行パターンも紹介するよ。](http://qiita.com/appwatcher/items/632460e15fbdb81b7a71)

[Swiftを使ってみて直面した闇。現時点で現場でSwiftを採用すべきかどうかの判断材料](http://qiita.com/appwatcher/items/50295e82ab0095902aaa)

[iOSの開発をする上で絶対に使うべき！外せない！webサービス、開発ツール集【完全版】](http://qiita.com/appwatcher/items/07a3babcb9b6cefb307e)

[注目のiBeacomなどの波に乗り遅れないために！iOSのBluetooth開発を容易にするライブラリを書きました。]
(http://qiita.com/appwatcher/items/7491beffd7260b713542)

[まだまだあった！iOSの開発を劇的に改善する最新のwebサービス、開発ツール集１]
(http://qiita.com/appwatcher/items/f0024fe2ac34da345f04)

[さらに快適なアプリ開発を！iOSの開発をもっと劇的に改善する最新のwebサービス、開発ツール集2]
(http://qiita.com/appwatcher/items/c15d7311e71b4c2b77f1)

[スパゲッティから脱出！iOS開発における遷移の問題をすっきり解決する便利ルーティングライブラリをご紹介]
(http://qiita.com/appwatcher/items/259e8d13fff0547e90af)