Edited at

[Golang]GETリクエストして、返ってきたJSONを確認するだけのサンプルコード


いきなり結論のコード

注)今回は、なるべく簡潔なコードで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))

ここの解説は以前の記事に任せます。


さいごに

最後まで読んで頂き、ありがとうございました。

また、間違い等があればコメントでツッコミ頂けると嬉しいです。