AFNetwork2.0在報錯1016,3840的解決方案及一些感悟,afnetwork2.03840
最近在學習AFNetwork,非常好的網路架構,能節省很多時間。不過請求網路資料時報錯1016,3840.
這兩個錯誤網上解決方案很多,http://blog.csdn.net/huifeidexin_1/article/details/38844535,這篇部落格的解決方案非常好。也確實起了效果,不過接下來問題來了。
比如我要實現最容易的登入功能,用http協議,我把帳號密碼傳給伺服器,如果驗證成功,它傳個1給我就行了。
+(BOOL)getLoginByUser:(NSString *)username andPass:(NSString *)password{ AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; manager.requestSerializer = [AFHTTPRequestSerializer serializer]; manager.responseSerializer = [AFHTTPResponseSerializer serializer]; NSDictionary *dict = @{@"nickName":username,@"password":password}; [manager GET:url parameters:dict success:^(AFHTTPRequestOperation *operation, id responseObject) { NSData *doubi = responseObject; NSString *shabi = [[NSString alloc]initWithData:doubi encoding:NSUTF8StringEncoding]; NSLog(@"%@",shabi); } failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"Error: %@", error); }]; return YES;}
因為加了"text/html",所以傳過來的是一個html頁面,1在body裡。即...<body>1</body>...
但是我只要1就行了,如果自己在寫演算法把1提取出來就太詭異了,並不可行。
後來才發現是我一開始就理解有問題。上面的方法處理的就是伺服器傳"text/html"的解決方案。用於爬蟲或者web直接顯示頁面等情況。
而我要的就是json資料
{"result": "1"}
這也正符合了AFNetwork預設支援的類型,其實ios開發不怎麼用到"text/html"類型。大部分情況下是json,所以這也是AFNetwork預設支援的。
這又回到了剛開始的時候,報了1016錯誤。
其實錯誤是伺服器的原因,伺服器要指定格式,http response的content-type。它要設定為json,那麼就不會報1016錯誤了。
+(BOOL)getLoginByUser:(NSString *)username andPass:(NSString *)password{ AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; NSDictionary *dict = @{@"nickName":username,@"password":password}; [manager GET:url parameters:dict success:^(AFHTTPRequestOperation *operation, id responseObject) { NSString *responseValue = [responseObject objectForKey:@"result"]; NSLog(@"%@",responseValue); } failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"Error: %@", error); }]; return YES;}
這個輸出結果就是1。
所以遇到了錯誤還是要多想想,即然自己要的就是json資料,幹嘛還要add"text/html",應該要想到其實是服務端的問題。