什么是cookie?
cookie最簡單的介紹就是服務器返回的一個字符串信息剥啤,只不過我們每次請求都需要把它發(fā)送給服務器锦溪。以AFN和android-async-http為例子,默認都會把cookie自動保存并且下次發(fā)送請求的時候?qū)ookie提交給服務器府怯。
什么時候會提交cookie到服務器刻诊?
這個問題需要知道cookie的作用域,cookie有效的作用域為當前文件目錄以及子目錄牺丙。例如:
http://www.xxx.com/love
//如果此請求返回了cookie则涯,并且path是/love
那么在程序的生命期間,通過AFN和android-async-http訪問所有的/love
目錄以及/love/xxx
的子目錄的時候冲簿,框架會自動將cookie提交到服務器粟判。
如果發(fā)起的請求不是/love
目錄本身或者其子目錄,那么框架就不會將cookie提交到服務器峦剔。如果這個時候需要我們訪問http://www.xxx.com/person
接口的時候也帶上之前返回的cookie档礁,該怎么辦?
返回的cookie存在哪里吝沫?
最簡單的辦法就是自己做cookie的存儲和發(fā)送呻澜,服務器返回的cookie會存儲在response 的Header里面,例如:
HTTP response Header:
{
"Content-Type" = "text/html;charset=UTF-8";
Date = "Thu, 29 Jun 2017 08:50:18 GMT";
Server = "Apache-Coyote/1.1";
"Set-Cookie" = "token=a27c5779-3718-4716-bbfa-6a51407c6d70";
"Transfer-Encoding" = Identity;
}
其中"Set-Cookie"是response的Header中默認用來存儲cookie的字段(當然你可以另外起其它名字惨险,但是通用的規(guī)范還是這個字符串)
提交給服務器的cookie存在哪里羹幸?
和response的Header一樣,request的Header中也有一個字段用來存儲cookie字符串辫愉,這個字段默認是cookie
栅受,例如:
HTTP request Header:
{
Cookie = token=c66fbbc7-d799-426e-b065-d23226833dda;
Content-Type = application/x-www-form-urlencoded; charset=utf-8;
Device-OS = 10.3;
version = 1.0.57;
User-Agent = XProduct/1.0.57 (iPhone; iOS 10.3; Scale/2.00);
Device-Name = x86_64;
Accept-Language = zh-Hans-US;q=1, en;q=0.9;
}
具體怎么做?
現(xiàn)在知道了cookie是什么,從哪來窘疮,往哪去袋哼,那么事情就簡單了,所以問題的最后變成了:如何獲取response Header中的鍵值對以及如何設置request Header闸衫?
當然涛贯,不管是iOS還是Android都有提供相應的HTTPCookie框架,其次其本質(zhì)無非就是從response Header中的"Set-Cookie"獲取字符串蔚出,然后將指定的cookie存儲在requset的Header中弟翘,例如:
//獲取cookie
NSHTTPURLResponse *res = (NSHTTPURLResponse *)response;
//fields的輸出結(jié)果就是上面的response header的內(nèi)容
NSDictionary *fields = [res allHeaderFields];
NSLog(@"fields = %@", [fields description]);
NSArray<NSHTTPCookie *> *cookie = [NSHTTPCookie cookiesWithResponseHeaderFields:fields forURL:request.URL]
上面NSHTTPCookie
的類方法其實就是將上面的respnse Header中的cookie字符串拆分成為一對象,比如下面就是拆分結(jié)果:
<NSHTTPCookie version:0 name:"token" value:"a27c5779-3718-4716-bbfa-6a51407c6d70"
expiresDate:(null) created:2017-06-29 08:50:21 +0000 sessionOnly:TRUE domain:"102.211.179.114"
partition:"none" path:"/XProduct" isSecure:FALSE>
我們完全可以不需要使用NSHTTPCookie骄酗,無非就是從response Header中獲得Set-Cookie
字段對應的字符串罷了稀余。
至于將cookie設置到request Header中的框架API,我就沒有去細看趋翻,因為我直接手動設置:
httpRequestSerializer = [AFHTTPRequestSerializer serializer];
//token是一個字符串睛琳,是response header中'Set-Cookie'對應的字符串
[httpRequestSerializer setValue:token forHTTPHeaderField:@"cookie"]
至于怎么使用API去做cookie,這個搜索一下還是挺多介紹的踏烙,本文主要介紹的是cookie從哪來师骗,存在哪,往哪去讨惩。