いきなり結論のコード
注)今回は、なるべく簡潔なコードでAPIを叩く確認をすることを優先しました。
そのため、コメントでお叱りを受けた通り、本当なら必要なはずのエラーハンドリングを省略していますので、このコードを利用される方は、その点をご注意ください。
また、コメント欄で@nobonobo 様から非常に丁寧に説明を頂いております。読んで頂く方は、ぜひそちらも読んでもらえると良いかと思います。
サンプルコード
package main
import (
"fmt"
"io/ioutil"
"net/http"
"net/url"
)
func main() {
base, _ := url.Parse("http://zipcloud.ibsnet.co.jp")
reference, _ := url.Parse("api/search?zipcode=100-0001")
endpoint := base.ResolveReference(reference).String()
req, _ := http.NewRequest("GET", endpoint, nil)
var client *http.Client = &http.Client{}
resp, err := client.Do(req) // 2019/09/04修正
if err != nil {
log.Fatal(err) // コメント欄を参照して下さい
}
defer resp.Body.Close()
body, _ := ioutil.ReadAll(resp.Body)
fmt.Println(string(body))
}
実行結果
{
"message": null,
"results": [
{
"address1": "東京都",
"address2": "千代田区",
"address3": "千代田",
"kana1": "トウキョウト",
"kana2": "チヨダク",
"kana3": "チヨダ",
"prefcode": "13",
"zipcode": "1000001"
}
],
"status": 200
}
していること
今回はこちらのAPIを使わせてもらいました。
シンプルに、エンドポイントに郵便番号を入れてリクエストを送ると、住所がJSONで返されるAPIです。
解説
url.Parse()
でURLが正しいものか確認
base, _ := url.Parse("http://zipcloud.ibsnet.co.jp")
-
http://zipcloud.ibsnet.co.jp
を入れることで、URLを確認 -
base
という変数に代入 - 第二引数はブランク修飾子にしているが、変数をセットすると、エラー内容が代入される。
ResolveReference
でURLを安全に繋げる
endpoint := base.ResolveReference(reference).String()
-
base
変数の値に、reference
変数の値を、繋いでいる。 -
endpoint
変数に代入している。 - ちなみに、この時点で
endpoint
変数には、http://zipcloud.ibsnet.co.jp/api/search?zipcode=100-0001
が代入されている。
http.NewRequest
でリクエストを投げる準備
req, _ := http.NewRequest("GET", endpoint, nil)
- struct(構造体)を作成している
- まだURLにアクセスはしていない
- 第三引数はGETリクエストなので、
nil
ですが、POSTの際などにはバイトを入れる
&http.Client{}
でクライアントをつくる
var client *http.Client = &http.Client{}
ここはおまじない的に捉えています。
僕の実力では、うまく説明ができない…
とにかく、作成したものをclient
変数に代入してます。
まだURLにアクセスしていません。
client.Do()
でURLにアクセス
resp, err := client.Do(req)
-
req
にはNewRequest()
で用意したstructが代入されている-
ちなみに
req
の中には- GETでのリクエスト
- URLエンドポイント
- nil
が入っている
-
アクセス結果を
resp
変数に代入しているここに関しては、コメントでツッコミを頂いておりますので、ぜひご参照下さい。
ioutil.ReadAll
で読み込んで出力
body, _ := ioutil.ReadAll(resp.Body)
fmt.Println(string(body))
ここの解説は以前の記事に任せます。
さいごに
最後まで読んで頂き、ありがとうございました。
また、間違い等があればコメントでツッコミ頂けると嬉しいです。