2
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.

AutifyAdvent Calendar 2021

Day 15

AutifyのWeb APIクライアントを作成しました

Posted at

この記事はAutify Advent Calendar 202115日目です。

AutifyのWeb API用のクライアントライブラリを作成したの少しまとめます。
https://github.com/trknhr/autify-go

Autifyとは

自動E2Eテスト支援ツールです。私の所属している会社で採用されているため私も業務の時間で触ることが多いです。

このライブラリはなにをするか

Autify Web APIを直接叩く部分をラップします。ユーザーにとってはGoでAPIを呼び出してそのデータを取得するのではなく関数を呼ぶだけで該当のAPIを操作できることになります。
https://autifyhq.github.io/autify-api/#/schedule/post_schedules__schedule_id_

なぜ作ったか

Autifyのシナリオの中身まで検索したい時がありその時に即興でWeb APIのラッパー的なのを作っていたのでそれをライブラリとして切り出しました。

苦労した点

レスポンスのデータの型がswaggerの記載と違う

大体合ってる気がしましたが、レスポンスのJSONのデータとswaggerに記載されている型と異なることがあり1つづつAPIのレスポンスを確認する必要がありました。
特に欲しかったシナリオの中身のステップを取得する箇所はswaggerファイルではごっそり抜けてたので1つ1つデータを確認する必要がありました。

迷った点

int or int64?

Goのintは処理系によってint32 or int64になります。IDはかなり大きな値もあり得ると21億より多くなるかも判断して当初からIDを全てint64に統一しています。
しかしGoに強い人に聞いたところ大体いまのPCの処理系は64bitだからあんまり気にする必要ないんじゃないかという助言を受け、intにしておいた方がよかったと感じました。int64は使う方もint64であることを意識せざる場面があるからです。
例えばfunc hoge(id int64) {}という関数は

hoge(1) // OK
id := 1
hoge(id) //NG

となりユーザがint64を意識する必要がありイマイチだなぁと感じました。

APIのバージョニングをどうするか

大抵のREST APIでバージョンニングがされています。バージョンニングに対してどうやってライブラリと対応するべきかという点についても調べました。結論から言うと今回のライブラリは何も考えずに作成しています。

バージョンニングされたディレクトリを作成するパターン

/v1/*.go
/v2/*.go

のようなディレクトリを作成して、ユーザー側で欲しいバージョンのWeb APIクライアントを

github.com/hogehoge/v1

のようにインポートする必要があります。

ライブラリは特定のバージョンのみを対応するパターン

これは何も考えず現在のライブラリは特定のバージョンのみをサポートすると言う考え方です。Web APIのバージョンが上がったらリポジトリを新たに作るか、新しいバージョンのWeb APIに適応するようにライブラリをアップグレードします。

クエリパラメーター

クエリパラメーターをどうやて組み立てるかについて少し悩みました。当初は以下のように直感的に実装しました。

var (
page *int
id *int
)
if page != nil {
//etc
}

この方法でも悪くないのですが、if文を何回も書くのが手間なところとベタガキなので使い回しの効きにくいことがネックでした。
mapにしてfor分で回すことも考えました。
クエリパラメータのためにmapを作成するのも少し嫌でしたしkeyとなる文字列はやはり使い回しのききにくいものとなっていました。

と色々調べて回った結果クエリパラメータをセットする関数を返す関数を作成する方法を採用しました。クエリパラメータの種類ごとに関数を作成する必要がありますが、これなら使い回しがしやすく且つ使う方も直感的に使えそうでした。
実装はこの辺を参照ください
https://github.com/trknhr/autify-go/blob/main/request_param.go

まとめ

Web APIのクライアントは処理としてはかなり単純でGoのライブラリ作成の練習になりました。普段ライブラリの作成などを行わないのでとても勉強になりました。限られた工数の中で作成したライブラリなのでユニットテストなどまだまだやりたい部分は残りますが、徐々に良い形にして行けたらと思います。

2
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
2
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?