码迷,mamicode.com
首页 > 其他好文 > 详细

golang Cookie

时间:2015-11-03 12:37:22      阅读:671      评论:0      收藏:0      [点我收藏+]

标签:

//Cookie的原理:

Cookie 是一小段文本信息,伴随着用户请求和页面在 Web 服务器和浏览器之间传递。用户每次访问站点时,Web 应用程序都可以读取 Cookie 包含的信息。 Cookie 的基本工作原理如果用户再次访问站点上的页面,当该用户输入 URLwww.*****.com时,浏览器就会在本地硬盘上查找与该 URL 相关联的 Cookie。如果该 Cookie 存在,浏览器就将它与页面请求一起发送到您的站点。主要是用于维护HTTP的状态的作用。


下面测试一下golang的Cookie的库,第一次请求从response获取cookie,然后第二次请求加在resquest信息中

package main

import (
	"fmt"
	"io/ioutil"
	"net/http"
	"net/http/cookiejar"
)

var gCurCookies []*http.Cookie
var gCurCookieJar *cookiejar.Jar

func initAll() {
	gCurCookies = nil
	//var err error;
	gCurCookieJar, _ = cookiejar.New(nil)

}

//get url response html
func getUrlRespHtml(url string) string {
	fmt.Printf("getUrlRespHtml, url=%s", url)

	var respHtml string = ""

	httpClient := &http.Client{
		CheckRedirect: nil,
		Jar:           gCurCookieJar,
	}

	httpReq, err := http.NewRequest("GET", url, nil)
	httpResp, err := httpClient.Do(httpReq)

		fmt.Printf("http get url=%s response error=%s\n", url, err.Error())
	}
	fmt.Printf("httpResp.Header=%s", httpResp.Header)
	fmt.Printf("httpResp.Status=%s", httpResp.Status)

	defer httpResp.Body.Close()

	body, errReadAll := ioutil.ReadAll(httpResp.Body)
	if errReadAll != nil {
		fmt.Printf("get response for url=%s got error=%s\n", url, errReadAll.Error())
	}
        //全局保存
	gCurCookies = gCurCookieJar.Cookies(httpReq.URL)

	respHtml = string(body)

	return respHtml
}

func dbgPrintCurCookies() {
	var cookieNum int = len(gCurCookies)
	fmt.Printf("cookieNum=%d", cookieNum)
	for i := 0; i < cookieNum; i++ {
		var curCk *http.Cookie = gCurCookies[i]
		fmt.Printf("\n------ Cookie [%d]------", i)
		fmt.Printf("\tName=%s", curCk.Name)
		fmt.Printf("\tValue=%s", curCk.Value)
		fmt.Printf("\tPath=%s", curCk.Path)
		fmt.Printf("\tDomain=%s", curCk.Domain)
		fmt.Printf("\tExpires=%s", curCk.Expires)
		fmt.Printf("\tRawExpires=%s", curCk.RawExpires)
		fmt.Printf("\tMaxAge=%d", curCk.MaxAge)
		fmt.Printf("\tSecure=%t", curCk.Secure)
		fmt.Printf("\tHttpOnly=%t", curCk.HttpOnly)
		fmt.Printf("\tRaw=%s", curCk.Raw)
		fmt.Printf("\tUnparsed=%s", curCk.Unparsed)
	}
}

func main() {
	initAll()

	fmt.Printf("====== step 1:get Cookie ======")
	var baiduMainUrl string = "http://www.baidu.com/"
	fmt.Printf("baiduMainUrl=%s", baiduMainUrl)
	getUrlRespHtml(baiduMainUrl)
	dbgPrintCurCookies()

	fmt.Printf("\n====== step 2:use the Cookie ======")

	var getapiUrl string = "https://passport.baidu.com/v2/api/?getapi&class=login&tpl=mn&tangram=true"
	getUrlRespHtml(getapiUrl)
	dbgPrintCurCookies()
}

//golang的Cookie使用挺简单的,通过Cookie可以维护登录状态

golang Cookie

标签:

原文地址:http://my.oschina.net/yang1992/blog/525218

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!