Posted at

golangでcookieを使う

More than 3 years have passed since last update.

サーバから送られてきたcookieを表示し、送られたcookieでサーバにアクセスするhttp clientのサンプルコード。


client.go

package main

import (
"net/http"
"fmt"
"net/http/cookiejar"
"net/url"
"log"
)

func main(){
jar, err := cookiejar.New(nil)
if err != nil {
log.Fatal(err)
}
client := &http.Client{ Jar: jar }
res, err := client.Get("http://localhost/set_cookie")
if err != nil {
log.Fatal(err)
}
defer res.Body.Close()
if res.StatusCode != 200 {
fmt.Printf("StatusCode=%d\n", res.StatusCode)
return
}

// Print cookie sent by server
set_cookie_url, err := url.Parse("http://localhost/set_cookie")
if err != nil {
log.Fatal(err)
}
cookies := jar.Cookies(set_cookie_url)
fmt.Printf("%v\n", cookies)

// Access different url to check if cookie is sent
res, err = client.Get("http://localhost/dump_cookie")
if err != nil {
log.Fatal(err)
}
if res.StatusCode != 200 {
fmt.Printf("StatusCode=%d\n", res.StatusCode)
return
}
}


上記のサンプルコードからのリクエストに対して、set-cookieヘッダー付きのレスポンスを送るサーバ側のサンプルコード。


server.go

package main

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

func setCookieHandler(w http.ResponseWriter, r *http.Request){
http.SetCookie(w, &http.Cookie{
Name: "cookie_field",
Value: "cookie_value",
Path: "/",
})
http.SetCookie(w, &http.Cookie{
Name: "cookie_field2",
Value: "cookie_value2",
Path: "/",
})
w.WriteHeader(http.StatusOK)
}

func dumpCookieHandler(w http.ResponseWriter, r *http.Request){
for k, v := range r.Header {
fmt.Printf("%s:%s\n", k, v)
}
w.WriteHeader(http.StatusOK)
}

func main(){
http.HandleFunc("/set_cookie", setCookieHandler)
http.HandleFunc("/dump_cookie", dumpCookieHandler)
log.Fatal(http.ListenAndServe(":80", nil))
}