LoginSignup
0
0

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-09-03

いきなり結論のコード

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

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

さいごに

最後まで読んで頂き、ありがとうございました。
また、間違い等があればコメントでツッコミ頂けると嬉しいです。

0
0
4

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
0
0