Go言語でcookieを扱う
HTTPレスポンスにCookieを設定する
Goで書いたサーバ側で、HTTPレスポンスヘッダのSet-Cookieフィールドを記述する。
コードは以下。
// 1
cookie := &http.Cookie{
Name: "hoge", // ここにcookieの名前を記述
Value: "bar", // ここにcookieの値を記述
}
// 2
http.SetCookie(w, cookie)
手順は、以下の通り
- httpパッケージのtype Cookieのフィールドを設定する
- httpパッケージのsetCookie関数の引数にResponseWriterとCookieを渡す
-> HTTPレスポンスヘッダのSet-CookieにCookieで追加したものが設定される
なお、NameやValue以外にもrfc6265に準拠した様々なフィールドを設定できる
cookieで設定できるフィールドは、以下のhttpパッケージのtype Cookieの限りである(公式より引用)
type Cookie struct {
Name string
Value string
Path string // optional
Domain string // optional
Expires time.Time // optional
RawExpires string // for reading cookies only
// MaxAge=0 means no 'Max-Age' attribute specified.
// MaxAge<0 means delete cookie now, equivalently 'Max-Age: 0'
// MaxAge>0 means Max-Age attribute present and given in seconds
MaxAge int
Secure bool
HttpOnly bool
Raw string
Unparsed []string // Raw text of unparsed attribute-value pairs
}
(引用元 https://golang.org/pkg/net/http/#Cookie)
HTTPリクエストからCookieを取得する
Goで書いたサーバ側で、クライアントからのHTTリクエストのヘッダに記述されているSet-Cookieフィールドを取得する。
コードは以下。
// 1
cookie, err := r.Cookie("hoge")
if err != nil {
log.Fatal("Cookie: ", err)
}
// 2
v := cookie.Value
fmt.Println(v)
- httpパッケージのtype RequestのCookieメソッドを使用して、HTTPリクエストからのcookieを取得する
- 取得したcookieのフィールドにアクセスする
実装してみる
実際にGoでcookieの設定と取得を行ってみる。
main.go
package main
import (
"net/http"
"fmt"
"log"
"html/template"
)
// cookieの設定を行う
func setCookies(w http.ResponseWriter, r *http.Request) {
cookie := &http.Cookie{
Name: "hoge",
Value: "bar",
}
http.SetCookie(w, cookie)
fmt.Fprintf(w, "Cookieの設定ができたよ")
}
// cookieの取得を行い、htmlを返す
func showCookie(w http.ResponseWriter, r *http.Request) {
cookie, err := r.Cookie("hoge")
if err != nil {
log.Fatal("Cookie: ", err)
}
tmpl := template.Must(template.ParseFiles("./cookie.html"))
tmpl.Execute(w, cookie)
}
// メイン
func main() {
http.HandleFunc("/", setCookies)
http.HandleFunc("/cookie", showCookie)
if err := http.ListenAndServe(":8080", nil); err != nil {
log.Fatal("ListenAndServe: ", err)
}
}
テンプレートは以下の通り
cookie.html
cookie.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>cookie</title>
</head>
<body>
<p>cookieの値は</p>
<p> name: {{.Name}} </p>
<p> value:{{.Value}} </p>
</body>
</html>
cookieの確認の仕方
蛇足だが、chromeのdeveloper toolsのApplication-> Cookiesでcookieを確認できる
参考にさせていただいたサイト