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
stubcellについては下記を参考にしてください。
API Stub Server
もう一つはライブラリ化はしてないのですが、stubcellにインスパイアされて私が作ったsinatraベースのアプリです。railsの案件のために作ったのでRESTだけの対応になります。
クライアント開発に置いて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を回そう
まだTestFlight使ってたの?急げ!終了目前のTestFlightから,今すぐにiOSもDeployGateに移行しよう!移行パターンも紹介するよ。
Swiftを使ってみて直面した闇。現時点で現場でSwiftを採用すべきかどうかの判断材料
iOSの開発をする上で絶対に使うべき!外せない!webサービス、開発ツール集【完全版】
[注目のiBeacomなどの波に乗り遅れないために!iOSのBluetooth開発を容易にするライブラリを書きました。]
(http://qiita.com/appwatcher/items/7491beffd7260b713542)
[まだまだあった!iOSの開発を劇的に改善する最新のwebサービス、開発ツール集1]
(http://qiita.com/appwatcher/items/f0024fe2ac34da345f04)
[さらに快適なアプリ開発を!iOSの開発をもっと劇的に改善する最新のwebサービス、開発ツール集2]
(http://qiita.com/appwatcher/items/c15d7311e71b4c2b77f1)
[スパゲッティから脱出!iOS開発における遷移の問題をすっきり解決する便利ルーティングライブラリをご紹介]
(http://qiita.com/appwatcher/items/259e8d13fff0547e90af)