8
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Fringe81Advent Calendar 2020

Day 20

チーム開発でフロントとサーバーの開発効率が上がるかもしれないやつ作ってみた

Last updated at Posted at 2020-12-20

この記事はFringe81 Advent Calendar20日目の記事です。
19日目を担当したtenajimaさんの記事 からのバトンをつなぎます!

はじめに

皆さんはチームで一つの機能をサーバーフロントで並行して開発する時、サーバーフロントのI/Fをどのように決めていますか?
僕が所属しているチームではまずapiドキュメントを作成して、それを元に開発を進めています。
そうすると、サーバーサイドが完成しないとフロントはmockとか作って動作確認をすることになります。また、サーバーができてもレスポンスがミスってたりすると修正が必要になったりと結構効率が悪い部分がありました。これはどうにか改善したい。

解決するぞ

基本的にapiドキュメントのレスポンスの例を使用して開発を進めているので、そいつを元にレスポンスを返してくれるmockサーバー的なやつ、またサーバーが返してきたレスポンスのjsonのkeyがそのドキュメントの例のkeyとあっているかをチェックしてくれるやつを作れば手戻りとかなく結合がスムーズにできそう。

作ってみた

そういうわけなので、作ってみました。その名もresp-man(post-manをパクったわけでは絶対にない)。こちら。一応汎用的に作っているので、もし使いたい人がいたら使ってみてください。

何ができるか

できることは二つです。

  1. response.jsonに記述したjsonをそのままレスポンスとして返す。 /return_response をフロントのリクエスト先として登録すればmockサーバー的にデータを返してくれる。
  2. サーバー側が作った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 さんの記事になります!

8
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?