emahiro/b.log

Drastically Repeat Yourself !!!!

(続)goでのhttpの書き方あれこれ

以前書いたこれの続き

ema-hiro.hatenablog.com

以前書いたgoでのhttpの書き方の内容の続編です。
Postの書き方とAutorizationヘッダーを付けたリクエストを構築するときの方法を備忘録としてまとめました。

標準パッケージはこちら

https://golang.org/pkg/net/http/

Goのhttpを使う

  • http.Post(method, url, data)
  • http.PostForm(url, data)
  • Client{} 型を使う

の三通りの書き方があります。

http.Postを使う

jsonFile, err := os.Open("data.json")
if err != nil {
    // error
}

resp, err := http.Post("sample.com", "application/json", jsonFile)

http.PostFormを使う

val := url.Values{}
val.Add("key", "value")

resp, err := http.PostForm("sample.com", val)

Client型を使う

client := http.Clietn{}

val := url.Values{}
val.Add("key", "value")

req, err := http.NewRequest("POST", "sample.com", strings.NewReader(val.Encode()))
if err != nil{
    // request create error
}

resp, err := client.Do(req)

GAEを使う

GAE上でhttpリクエストを使うときは以前記載した内容と同じで urlfetch(appengine.context) を使います。
内容は標準のパッケージのClient型に近い。

Postを使う

// r は *http.Request
ctx := appengine.NewContext(r) // GAEのContextを作成する
client := urlfetch.Client(ctx)

jsonFile, err := os.Open("data.json")
if err != nil {
    // error
}


resp, err := client.Post("POST", "sample.com", jsonFile)

PostFormを使う

// r は *http.Request
ctx := appengine.NewContext(r) // GAEのContextを作成する
client := urlfetch.Client(ctx)


val := url.Values{}
val.Add("key", "value")

resp, err := client.PostForm("sample.com", val)

client.Do型を使う

// r は *http.Request
ctx := appengine.NewContext(r) // GAEのContextを作成する
client := urlfetch.Client(ctx)

val := url.Values{}
val.Add("key", "value")
req, err := http.NewRequest("POST", "sample.com", http.NewReader(val.Encode())
if err != nil {
    // request create error
}

resp, err := client.Do(req)

Header情報を追加する

Header情報を付加するには標準パッケージ、GAE、どちらにしてもClient型を使うことになります。

http.Packageのとき

req, err := http.NewRequest("Post", "sapmple.com", url.Values{})
if err != nil{
     // request create error
}
req.Header.Set("ContentType", "application/json")
req.Header.Set("Authorization", "XXXXXXXX")

// httpパッケージを使う場合
client := http.Client{}
resp, err := client.Do(req)

GAEのとき

req, err := http.NewRequest("Post", "sapmple.com", url.Values{})
if err != nil{
     // request create error
}
req.Header.Set("ContentType", "application/json")
req.Header.Set("Authorization", "XXXXXXXX")

// GAEを使う時
// r は *http.Request
ctx := appengine.NewContext(r)
client := urlfetch.Client(crx)
resp, err := client.Do(req)

Header情報を付与するときは、予め func NewRequest(method, url string, body io.Reader) (*Request, error)http.Request 型を生成しておかなければなりません。
その Request 型に対してHeader情報を付与していくことになります。

Refs

http - The Go Programming Language

qiita.com

cURL as DSL — cURL as DSL 1.0 documentation