パラメータに構造体を使ってシュットWebAPIを叩く

Sep 1, 2018

WebAPIの問い合わせ処理で、リクエストパラメータを構造体で定義した場合に便利な
go-querystring/queryの紹介。

TL;DR

紹介するのは、go-twitterのソースリーディング中に見つけたgo-querystringというライブラリ。
Goの場合、構造体のkeyの部分をreflectパッケージで取得することになりますが、本ライブラリはその処理を抽象化してくれる。

Examples

TODO

「api.example.com/resource」というエンドポイントに対して、
「api.example.com/resource?ParamsA=pA&ParamsB=pB」とリクエストする。

Code Examples

パッケージをインポート。

import (
	...
	
	"github.com/google/go-querystring/query"
)

リクエストパラメータを、構造体で定義する。

type Params struct {
	ParamsA string
	ParamsB string
}

上記の構造体を利用して、WebAPIに問い合わせを行う。(コメントで補足)

func main() {
	baseurl := "api.example.com/resource"
	var param Params
	param.ParamsA = "pA"
	param.ParamsB = "pB"

	// リクエストパラメータを定義
	urlValues := url.Values{}

	// Params構造体を引数に入れる(ポイント)
	queryvalues, err := query.Values(param)
	// ⇒ 「map[タグ名(json)バリュー]対応する構造体のバリュー」が返却
	if err != nil {
		fmt.Fprintln(os.Stderr, "%v", err)
	}

	// 構造体の変数名とインスタンスの設定値を取り出し、リクストパラメータを作成
	for key, values := range queryvalues {
		fmt.Println(key, values)
		for _, v := range values {
			urlValues.Add(key, v)
		}
	}
	req, _ := http.NewRequest("GET", baseurl, nil)

	// リクエストパラメータをurlに設定
	req.URL.RawQuery = urlValues.Encode()
	fmt.Println(req.URL)
}

実行結果は以下のようになる。

ParamsA [pA]
ParamsB [pB]
api.example.com/resource?ParamsA=pA&ParamsB=pB

あとはClient.Do(Request)メソッドでリクエストすれば、レスポンスが返却される。
この記事が分かりやすい。

その他

  • interface型で構造体をうけとれるので、様々のAPIエンドポイントのリクエストパラメータ受け取り処理を共通化出来る。
  • クラアント用のWebAPIライブラリを作成する際に便利。(go-twitterのようなライブラリ)
  • 本記事のサンプルはGithubで公開中。

最後に

このHugoテンプレートGoのSyntaxハイライトがなくて微妙・・・。
(09/02追記)HugoにSyntaxハイライト機能がありました。適用済みです。
こちらの記事を参考にしました。



Categories:
Tags: