最近对
最近使用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];
原文:https://www.cnblogs.com/JMarshall/p/11691197.html