http pkg を使って postする際、
リクエストヘッダの違いで、若干ハマったのでメモ。
はじめに
net/http
pkg の使い方に関しては、
こちらの記事が詳しいので、参考にさせていただきました。
Go net/httpパッケージの概要とHTTPクライアント実装例
コード例
■パラメータをURLエンコードする場合
要はContent-Type が、 application/x-www-form-urlencoded
の場合です。
net/url
pkg で定義されている type Values
を使ってます。
https://golang.org/pkg/net/url/#example_Values
package hoge
import (
"net/http"
"net/url"
"strings"
)
func HttpPost(url, token, device string) error {
values := url.Values{}
values.Set("token", token)
values.Add("device", device)
req, err := http.NewRequest(
"POST",
url,
strings.NewReader(values.Encode()),
)
if err != nil {
return err
}
// Content-Type 設定
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
return err
}
defer resp.Body.Close()
return err
}
■パラメータがjson形式の場合
Content-Type が、 application/json
の場合。
jsonStr
という変数名の未加工文字列リテラルで、
json形式のパラメータを記述しています。
package hoge
import (
"net/http"
"net/url"
"bytes"
)
func HttpPost(url, token, device string) error {
jsonStr := `{"token":"` + token + `","device":"` + device + `"}`
req, err := http.NewRequest(
"POST",
url,
bytes.NewBuffer([]byte(jsonStr)),
)
if err != nil {
return err
}
// Content-Type 設定
req.Header.Set("Content-Type", "application/json")
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
return err
}
defer resp.Body.Close()
return err
}
参考
http://stackoverflow.com/questions/24455147/go-lang-how-send-json-string-in-post-request