使用Golang来使用cookie
展示从服务器发送的cookie,并使用收到的cookie访问服务器的HTTP客户端示例代码。
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头的响应。
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))
}