📮

「郵便番号・デジタルアドレス for Biz」のGolang向けクライアントライブラリを開発した

に公開

こちらが作ったものになります。名前の yd4b は 「Yuubinbangou DigitalAddress for Biz」に由来しています。
https://github.com/aethiopicuschan/yd4b-go

使い方

サンプルコードとしては以下の通りです。

package main

import (
	"log"

	"github.com/aethiopicuschan/yd4b-go/v1/yd4b"
)

func main() {
	// APIクライアントを作成
	client := yd4b.NewClient("https://example.com", "Your Client ID", "Your Client secret", "Your global ip address")

	// トークンを取得してクライアントにセットする
	res, err := client.GetToken()
	if err != nil {
		log.Fatal(err)
	}
	client.SetToken(res.Token)

	// 郵便番号、事業所個別郵便番号、デジタルアドレスから住所を検索
	res2, err := client.Searchcode("1000001")
	if err != nil {
		log.Fatal(err)
	}
	log.Println(res2.Addresses[0].PrefName, res2.Addresses[0].CityName, res2.Addresses[0].TownName)
	// Output: 東京都 千代田区 千代田

	// 住所から郵便番号を検索
	res3, err := client.AddressZip(yd4b.WithPrefName("東京都"), yd4b.WithCityName("千代田区"), yd4b.WithTownName("千代田"))
	if err != nil {
		log.Fatal(err)
	}
	log.Println(res3.Addresses[0])
	// Output: {1000001 13 東京都 トウキョウト TOKYO 13101 千代田区 チヨダク CHIYODA-KU 千代田 チヨダ CHIYODA}
}

解説

NewClient に渡す必要があるのは以下の3点です。

  • APIのオリジン
  • クライアントIDとクライアントシークレット
  • 送信元IPアドレス

このうち、APIのオリジンはAPIリファレンスでダウンロードできるOpenAPI specificationに記載されています。

クライアントIDとクライアントシークレットについてはテスト用API認証情報を用いるか、システムを新規登録した際に取得することができます。

送信元IPアドレスは実際にAPIを叩く主体のIPアドレスを設定すれば問題ありません。例えば、自宅のPCから叩く場合は自宅のIPアドレスを設定するといった感じです。

オプションについて

現在提供されている searchcodeaddresszip というAPIはそれぞれオプションが存在します。これらを全て引数に取るような実装はあまりにも面倒くさいため、Functional Option Patternで指定できるようにしました。上記サンプルコードでも With... という関数を使っていますが、まさにそれです。詳細はドキュメントを参考にしてください。

カスタムHTTPクライアント

HTTPリクエストを行うにあたって、デフォルトでは http.DefaultClient.Do を使用していますが、型さえ一致していれば他の実装に置き換えることが可能です。具体的には以下のような形です。

func(req *http.Request) (*http.Response, error)

yd4b.ClientSetDoFunc に上記の型の関数を渡すことで設定できます。

エラーハンドリング

独自の Error 型を定義しています。これによって、以下のような実装が可能です。

if err := someFn(); err != nil {
	var yd4berr *yd4b.Error
	if errors.As(err, &yd4berr) {
		http.Error(w, yd4berr.Message, yd4berr.StatusCode)
		return
	}
	http.Error(w, "internal server error", 500)
}

以上です。お読み頂きありがとうございます。

Discussion