您的位置:首页 > 移动开发 > IOS开发

AFN 3.0 表单上传图片和文字 iOS 7.0的一些问题

2016-05-11 00:00 447 查看
背景:在上一个项目版本中一直使用AFNetworking2.0这个主流的网络请求库,AFHTTPRequestOperationManager从来未让人操心过。在新版迭代中,突发奇想的去升级AFNetworking3.0,使用了AFHTTPSessionManger之后让我操碎了心,如何操碎了新,让我慢慢道来。

在使用AFNetworking v3.0之前,当然是要去了解一下AFNetworking v3.0的具体变化(当然,v2.0版本我也不是很熟,就知道AFHTTPRequestOperationManager而已)。简要的总结说是AFHTTPRequestOperationManager这个类已经被弃用了,将使用AFHTTPSessionManger来取而代之,具体原因可以查看一下AFNetworking 3.0迁移指南。就听大神的说,都换成了AFHTTPSessionManger,API也更新了一遍。用虚拟机跑了一遍主要的用到的API,主要是以下三个:

*[AFHTTPSessionManger GET: parameters: progress: success: failure:]

*[AFHTTPSessionManger POST: parameters: progress: success: failure:]

*[AFHTTPSessionManger POST: parameters: constructingBodyWithBlock: progress: success: failure:]

在iOS8.0以上版本是正常运行,即使在上传图片的时候出现response Code=-1016 "Request failed: unacceptable content-type: text/html"的问题也是用

AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];

manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"]

或者是

AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];

manager.responseSerializer = [AFHTTPResponseSerializer serializer]

轻松解决。

只是在iOS7.1的版本,使用前两个没有什么问题,倒是上传功能,出了response Code=-1011 "Request failed: length required (411)这个问题让我纠结了一遍。后来查了一下AFNetworking的issue集,还真遇到一个,试了几次终于可以使用了,下面贴下代码:

if ([UIDevice currentDevice].systemVersion.integerValue >= 8.0) {

AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];

manager.responseSerializer = [AFHTTPResponseSerializer serializer];

[manager POST:url_upload parameters:parameters constructingBodyWithBlock:^(id<AFMultipartFormData> _Nonnull formData) {

[formData appendPartWithFileURL:path name:@"pic" error:nil];

} progress:^(NSProgress * _Nonnull uploadProgress) {

} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {

NSLog(@"上传成功");

} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {

NSLog(@"上传失败");

}];

}else{

NSString *tmpFilename = [NSString stringWithFormat:@"%f",[NSDate timeIntervalSinceReferenceDate]];

NSURL *tmpFileUrl = [NSURL fileURLWithPath:[NSTemporaryDirectory() stringByAppendingPathComponent:tmpFilename]];

NSMutableURLRequest *request = [[AFHTTPRequestSerializer serializer] multipartFormRequestWithMethod:@"POST" URLString:url_upload parameters:parameters constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {

[formData appendPartWithFileURL:path name:@"pic" error:nil];

} error:nil];

[[AFHTTPRequestSerializer serializer] requestWithMultipartFormRequest:request writingStreamContentsToFile:tmpFileUrl completionHandler:^(NSError * _Nullable error) {

AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];

manager.responseSerializer = [AFHTTPResponseSerializer serializer];

NSURLSessionUploadTask *uploadTask = [manager uploadTaskWithRequest:request fromFile:tmpFileUrl progress:nil completionHandler:^(NSURLResponse * _Nonnull response, id _Nullable responseObject, NSError * _Nullable error) {

[[NSFileManager defaultManager] removeItemAtURL:tmpFileUrl error:nil];

if (error) {

NSLog(@"失败");

}else{

NSLog(@"成功");

}

}];

[uploadTask resume];

}];

贴上问题解答位置:https://github.com/AFNetworking/AFNetworking/issues/1398

文/挣扎在编码世界(简书作者)
原文链接:http://www.jianshu.com/p/0a3820d6a951
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: