//Cookie的原理:
Cookie是一小段文本信息,伴随着用户请求和页面在Web服务器和浏览器之间传递。用户每次访问站点时,Web应用程序都可以读取Cookie包含的信息。Cookie的基本工作原理如果用户再次访问站点上的页面,当该用户输入URLwww.*****.com时,浏览器就会在本地硬盘上查找与该URL相关联的Cookie。如果该Cookie存在,浏览器就将它与页面请求一起发送到您的站点。主要是用于维护HTTP的状态的作用。
下面测试一下golang的Cookie的库,第一次请求从response获取cookie,然后第二次请求加在resquest信息中
packagemain import( "fmt" "io/IoUtil" "net/http" "net/http/cookiejar" ) vargCurCookies[]*http.Cookie vargCurCookieJar*cookiejar.Jar funcinitAll(){ gCurCookies=nil //varerrerror; gCurCookieJar,_=cookiejar.New(nil) } //geturlresponsehtml funcgetUrlRespHtml(urlstring)string{ fmt.Printf("getUrlRespHtml,url=%s",url) varrespHtmlstring="" httpClient:=&http.Client{ CheckRedirect:nil,Jar:gCurCookieJar,} httpReq,err:=http.NewRequest("GET",url,nil) httpResp,err:=httpClient.Do(httpReq) fmt.Printf("httpgeturl=%sresponseerror=%s\n",err.Error()) } fmt.Printf("httpResp.Header=%s",httpResp.Header) fmt.Printf("httpResp.Status=%s",httpResp.Status) deferhttpResp.Body.Close() body,errReadAll:=IoUtil.ReadAll(httpResp.Body) iferrReadAll!=nil{ fmt.Printf("getresponseforurl=%sgoterror=%s\n",errReadAll.Error()) } //全局保存 gCurCookies=gCurCookieJar.Cookies(httpReq.URL) respHtml=string(body) returnrespHtml } funcdbgPrintCurCookies(){ varcookieNumint=len(gCurCookies) fmt.Printf("cookieNum=%d",cookieNum) fori:=0;i<cookieNum;i++{ varcurCk*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) } } funcmain(){ initAll() fmt.Printf("======step1:getCookie======") varbaiduMainUrlstring="http://www.baidu.com/" fmt.Printf("baiduMainUrl=%s",baiduMainUrl) getUrlRespHtml(baiduMainUrl) dbgPrintCurCookies() fmt.Printf("\n======step2:usetheCookie======") vargetapiUrlstring="https://passport.baidu.com/v2/api/?getapi&class=login&tpl=mn&tangram=true" getUrlRespHtml(getapiUrl) dbgPrintCurCookies() }
//golang的Cookie使用挺简单的,通过Cookie可以维护登录状态