この記事はFringe81 Advent Calendar20日目の記事です。
19日目を担当したtenajimaさんの記事 からのバトンをつなぎます!
はじめに
皆さんはチームで一つの機能をサーバーフロントで並行して開発する時、サーバーフロントのI/Fをどのように決めていますか?
僕が所属しているチームではまずapiドキュメントを作成して、それを元に開発を進めています。
そうすると、サーバーサイドが完成しないとフロントはmockとか作って動作確認をすることになります。また、サーバーができてもレスポンスがミスってたりすると修正が必要になったりと結構効率が悪い部分がありました。これはどうにか改善したい。
解決するぞ
基本的にapiドキュメントのレスポンスの例を使用して開発を進めているので、そいつを元にレスポンスを返してくれるmockサーバー的なやつ、またサーバーが返してきたレスポンスのjsonのkeyがそのドキュメントの例のkeyとあっているかをチェックしてくれるやつを作れば手戻りとかなく結合がスムーズにできそう。
作ってみた
そういうわけなので、作ってみました。その名もresp-man(post-manをパクったわけでは絶対にない)。こちら。一応汎用的に作っているので、もし使いたい人がいたら使ってみてください。
何ができるか
できることは二つです。
- response.jsonに記述したjsonをそのままレスポンスとして返す。
/return_response
をフロントのリクエスト先として登録すればmockサーバー的にデータを返してくれる。 - サーバー側が作ったjsonを
/check_response
に投げると、response.jsonにあるjsonのkeyと完全に一致しているか見れくれる。
詳しい使い方はREADMEに書いてあるのでそちらをみていただけたらと思います。mm
一応、プログラムも
内部の技術的なこともちょっと書いておきます。
golangで実装しているのですが、golangでjsonを扱う時は、基本的に構造体を用意して json.Umarshal
とかをやると思います。ただ、今回は不特定な形のjsonに対応する必要があり、構造体を予め用意して展開するのは難しそう。最初はjsonのstringから構造体を生成する方法とかないのかなーと思って調べたのですが、見つけられず…ということで、そのまま []byte
のまま扱うことにしました。
そうすると、response.jsonをバイト列で読み込んでそのまままるっとレスポンスにしてしまえば良いので、1の機能はさくっと完成。
2の機能に関しては、jsonのkeyをリクエストのbodyとresponse.jsonから抜き出せればいいので以下の関数を実装しました
func extractJsonKeys(rowJson io.Reader) []string {
jsonKeys := make([]string, 0, 30)
scanner := bufio.NewScanner(rowJson)
for scanner.Scan() {
text := scanner.Text()
if strings.Contains(text, ":") {
// 基本的にjsonは 'key: value' の形なので、':'の前がキーになる
jsonKey := strings.TrimSpace(strings.Replace((strings.Split(text, ":"))[0], "\"", "", -1))
jsonKeys = append(jsonKeys, jsonKey)
}
}
return jsonKeys
}
jsonを1行ずつ読み込んで、:
のある行を:
で前後に分割し、前の方をkeyとしています。
response.jsonを読み込んだファイルポインタの *os.file
とリクエストのbodyの io.ReadCloser
はどちらも、io.Reader
を実装しているので、それを引数に取っていい感じに一つの関数にまとめられました。
課題
上のプログラムを読むとわかりますが、curlとかで叩く時に、jsonが改行されてないとうまくjsonを読み込めません。ここは改善の余地がありそうです。
また、そもそもresponse.jsonに書いてあるレスポンスのjsonの形式が間違っているとエラーになってしまうのですが、それを検知する仕組みがないのでそこも改善できたらいいかなと思っています。(byteで扱っているのでちょっと大変そう)
別の視点で、使うのに関して今は1種類のレスポンスしか扱えないので複数扱えるようになるといいなーと思っております。(ポート番号変えて複数サーバー立ち上げればいけますが、使い勝手がいいとは言えない…)
と、諸々まだ改善点がありますが、使ってもらってフィードバックもらいながら改善していきたいなーと思っております。
ということで、今回はチーム開発の効率をちょっとだけよくできるかもしれないツールを作ったので、それについて書いてみました!
明日は、gion さんの記事になります!