AFNetworking是最使人喜歡的ios網絡庫,它構建於在NSURLConnection, NSOperation等Foundation技術之上,奉承的話很少說了,今天記錄一下關於使用它又遇到的一個小問題。ios
----------------------------------------我是分割線-------------------------------------web
平時公司的項目是利用登錄後獲取到一個token(令牌),當再次請求該用戶的其餘信息時,在post請求的body,添加token參數便可。服務器
[self.manager POST:接口 parameters:@{@"參數名":123,@「token」:} progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { }failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { NSLog(@"%@",[error description]); }];
可是後臺服務器是利用web的cookie保持登錄會話狀態,所謂cookie是爲了辨別用戶身份、進行session跟蹤而儲存在用戶本地終端上的數據。cookie
因此AFNetworking中並無專門爲cookie封裝的代碼,不過底層使用的是NSURLRequest,因此咱們能夠獲取到請求時服務器返回的cookie網絡
NSString*urlStr=[NSString stringWithFormat:@"你的接口?username=%@&password=%@",account,password];
NSArray *cookies = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookiesForURL: [NSURL URLWithString:urlStr]];//獲得cookie
NSString*JSESSIONID=@""; for (NSHTTPCookie*cookie in cookies) { if ([cookie.name isEqualToString:@"JSESSIONID"]) { JSESSIONID=cookie.value; } } //ps :咱們也能夠獲得cookie裏面的session和其餘信息
//將獲得的cookie保存一下 NSData *data = [NSKeyedArchiver archivedDataWithRootObject:cookies]; [[NSUserDefaults standardUserDefaults] setObject:data forKey:@"cookie"]; [[NSUserDefaults standardUserDefaults] synchronize];
好了,經過以上方法,咱們獲得了cookie和session。session
重點來了,當再次請求時,咱們能夠設置一下cookie:post
NSString *cookieStr = [NSString stringWithFormat:@"JSESSIONID=%@",JSESSIONID];//能夠設置一下session,也能夠添加其餘的信息 [self.manager.requestSerializer setValue:cookieStr forHTTPHeaderField:@"Cookie"];//設置到headerField
能夠打印一下:url
NSLog(@"%@",self.manager.requestSerializer.HTTPRequestHeaders);
----------------------------------------------------我是分割線------------------------------------------spa
剛纔說了那麼多,其實說的都是廢話,由於AFNetworking是自動保持cookie的,咱們不用去刻意處理它(獲取與上傳),除非你有一些須要code
固然您也能夠設置不用保持cookie
[self.manager.requestSerializer setHTTPShouldHandleCookies:YES];//默認是yes
若是你的項目後臺是用cookie保持登錄會話狀態,具體因項目而異,登錄完成後,不用作任何處理,直接post請求,afnetworking自動保持cookie,不用本身去上傳cookie(session)。
固然你也能夠刪除cookie
NSHTTPCookieStorage *cookieJar = [NSHTTPCookieStorage sharedHTTPCookieStorage]; NSArray *cookies = [NSArray arrayWithArray:[cookieJar cookies]]; for (NSHTTPCookie *cookie in cookies) { if ([[cookie name] isEqualToString:key]) { [cookieJar deleteCookie:cookie]; } } }