[Go言語]HTTP通信を行う

goで外部のAPIからデータを取得した場合にはnet/httpパッケージを利用します
参照)https://pkg.go.dev/net/http
例えば下記のようなjsonファイルを返すAPIがあるとします

{
  user_id:"1",
  user_name:"Tanaka"
}

その場合、下記のようにすることで取得できる

package main

import (
	"fmt"
	"io"
	"net/http"
)

func main() {
	resp, err := http.Get("対象のURL")
	if err != nil {

		fmt.Println(err)
		return
	}
	defer resp.Body.Close()
	body, err := io.ReadAll(resp.Body)
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(string(body))
}

この結果はレスポンスから{user_id:”1″,user_name:”Tanaka”}が返却されます

Postメソッドの場合は

resp, err := http.Post("対象のURL","ContentType",body)

で取得できる
bodyは、io.Readerに変換する必要があるためstrings.NewReaderなどを使用して変換する必要があるため下記のようにする。

package main

import (
	"fmt"
	"io"
	"net/http"
	"strings"
)

func main() {
	body := strings.NewReader("{'key':'value'}")
	resp, err := http.Post("対象のURL", "applicatoin/json", body)
	if err != nil {

		fmt.Println(err)
		return
	}
	defer resp.Body.Close()
	resBody, err := io.ReadAll(resp.Body)
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(string(resBody))
}

ほかにもGet、Postメソッド以外にもhttp.NewRequest(“GET”, “http://example.com”, nil)とすることでリクエストが行える

client := &http.Client{}
req, _ := http.NewRequest("GET", "対象のURL", nil)
// ヘッダを追加する場合は下記のようにする
req.Header.Add("If-None-Match", `W/"wyzzy"`)
resp, err := client.Do(req)