最近對
最近使用AFNetworking和后台進行交互。使用的請求包含POST PUT GET其中前兩種的因為參數的原因苦苦追尋很久。現在就來總結一下:
先上代碼
-(void)getUserHeadicon:(NSString*) headiconURL{ AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; manager.responseSerializer = [AFHTTPResponseSerializer serializer]; manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"text/html",@"text/plain",@"application/json", @"text/json", @"text/javascript" ,@"image/jpeg",nil]; NSMutableDictionary *params = [NSMutableDictionary dictionary]; params[@"filename"] = headiconURL;//[headiconURL stringByAppendingString:@".jpg"]; [manager POST: [[NSString stringWithFormat:@"http://example.com/download"] stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet characterSetWithCharactersInString:@"#%^{}\"[]|\\<> "].invertedSet] parameters:params progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { NSLog(@"請求用戶頭像成功"); self.Headicon_login.image = [UIImage imageWithData:responseObject]; } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { NSLog(@"請求失敗:%@",error); }]; }
考慮以下幾個方面:
首先服務器端是否錯誤的在URL里面解析參數(URL的樣式和GET請求一樣),正確的應該是在Body里面解析移動端發來的Post請求。
然后依據你請求的資源,服務器返回的格式做一個調整。默認的AFHTTPSessionManager是json的解析,假如你下載圖片是會出錯的!然后再在acceptableContentTypes里面設置對應的服務器返回的類型。使用NSMutableDictionary作為參數的傳遞。其中POST和PUT方法有些許差別。后文將會對着差別進行個比較。
假如你順利的得到數據之后,怎樣才能變成你想要的結果呢。responseObject,就是最開始的狀態。最簡單的方式,我打一個斷點,這樣在控制台就能直接看到其屬性。然后用對應的初始化方法就行了。比如服務器返回的是json,那么manager就會把它處理成一個字典,key相同,value為后續的值,一般情況下為數組;再者,下載圖片,這時候結果應該是NSData類型的,使用UIImage.imageWithData就能將圖片轉化完成。
POST 和 PUT 請求圖片的差別:
先看方法PUT:
NSData *imageData = UIImageJPEGRepresentation(image, 1); NSUserDefaults *user = [NSUserDefaults standardUserDefaults]; NSString* userTel = [user valueForKey:@"userPhone"]; NSDictionary *paramDic = @{@"tel":userTel}; NSMutableURLRequest * request = [[AFHTTPRequestSerializer serializer] multipartFormRequestWithMethod:@"PUT" URLString:@"http://example.com/avatar" parameters:paramDic constructingBodyWithBlock:^(id<AFMultipartFormData> _Nonnull formData) { [formData appendPartWithFileData:imageData name:@"newImg" fileName:[userTel stringByAppendingString:@".jpg"] mimeType:@"image/jpg"]; } error:nil]; AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"text/html",@"application/json",@"text/javascript",@"text/json",@"text/plain", nil]; // 使用表單的方式進行提交, uploadTaskWithStreamedRequest 另一個直接上傳FileURL 的方式,會報錯500 NSURLSessionUploadTask * task = [manager uploadTaskWithStreamedRequest:request progress:^(NSProgress * _Nonnull uploadProgress) { } completionHandler:^(NSURLResponse * _Nonnull response, id _Nullable responseObject, NSError * _Nullable error) { if (error) { NSLog(@"服務器出問題:%@",error); } NSLog(@"你啊啥的還是帶回家啊啥的%@",responseObject); }]; [task resume];