设为首页 加入收藏

TOP

AFNetworking二次封装的那些事(二)
2017-10-13 09:53:59 】 浏览:1101
Tags:AFNetworking 封装 那些
ailure; - (nullable NSURLSessionDataTask *)POST:(NSString *)URLString parameters:(nullable id)parameters constructingBodyWithBlock:(nullable void (^)(id <AFMultipartFormData> formData))block progress:(nullable void (^)(NSProgress *uploadProgress))uploadProgress success:(nullable void (^)(NSURLSessionDataTask *task, id _Nullable responseObject))success failure:(nullable void (^)(NSURLSessionDataTask * _Nullable task, NSError *error))failure;

区别就在于constructingBodyWithBlock,这也是我遇到的两个问题的根源.

往下看,会发现,第一个方法:
[mutableRequest setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];

而第二个方法:

//先执行我们传进去的block
if (block) {
    block(formData);
}
return [formData requestByFinalizingMultipartFormData];

//如果参数为空,则content-type为默认的,不为空则为multipart/form-data
- (NSMutableURLRequest *)requestByFinalizingMultipartFormData {
    if ([self.bodyStream isEmpty]) {
        return self.request;
    }

    // Reset the initial and final boundaries to ensure correct Content-Length
    [self.bodyStream setInitialAndFinalBoundaries];
    [self.request setHTTPBodyStream:self.bodyStream];

    [self.request setValue:[NSString stringWithFormat:@"multipart/form-data; boundary=%@", self.boundary] forHTTPHeaderField:@"Content-Type"];
    [self.request setValue:[NSString stringWithFormat:@"%llu", [self.bodyStream contentLength]] forHTTPHeaderField:@"Content-Length"];

    return self.request;
}

这样我的问题就迎刃而解了.
前同事为了统一处理,所有的请求都是经第二个函数,所以即使不是传文件,如果有参数, Content-Type还是multipart/form-data.
而block是统一处理的:

    if ([obj isKindOfClass:[UIImage class]]) {
                UIImage *image = obj;
                if (image.size.height > 1080 || image.size.width > 1080) {
                    
                    image = [image imageWithMaxSide:1080];
                    
                    [formData appendPartWithFileData:UIImageJPEGRepresentation(image, 0.3f) name:key fileName:[NSString stringWithFormat:@"%@.jpeg",key] mimeType:@"image/jpeg"];
                } else if (image.size.height > 600 || image.size.width > 600)  {
                    [formData appendPartWithFileData:UIImageJPEGRepresentation(image, 0.5f) name:key fileName:[NSString stringWithFormat:@"%@.jpeg",key] mimeType:@"image/jpeg"];
                } else {
                    [formData appendPartWithFileData:UIImageJPEGRepresentation(image, 1) name:key fileName:[NSString stringWithFormat:@"%@.jpeg",key] mimeType:@"image/jpeg"];
                }
            }

只处理了传一张照片,没有考虑到传数组里面放多张图片的情况,所以服务器不知道这是图片啊,怎么解析呢!
上一个项目也没有传多张图片的情况,所以一直没有发现这个问题.

最后的解决方法是:

.h  (继承AFHTTPSessionManager)
//这个函数调用AF的第一个方法,不传文件时调用
+ (void)requestDataWithHTTPPath:(NSString *)path
                     parameters:(NSDictionary *)parameters
                        success:(RequestSuccessBlock)success
                        failure:(RequestFailureBlock)failure;

//这个函数调用AF的第二个方法,传文件时用
+ (void)uploadFileWithHTTPPath:(NSString *)path
                     parameters:(NSDictionary *)parameters
                        success:(RequestSuccessBlock)success
                        failure:(RequestFailureBlock)failure;  

.m
+ (void)requestDataWithHTTPPath:(NSString *)path
                     parameters:(NSDictionary *)parameters
                        success:(RequestSuccessBlock)success
                        failure:(RequestFailureBlock)failure {
    [KGAPIClient sharedRequestDataClient].isUploadFile = NO;
    [[KGAPIClient sharedRequestDataClient] requestDataWithHTTPPath:path parameters:parameters success
首页 上一页 1 2 3 4 下一页 尾页 2/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇安装Cocoapods时候ERROR: While e.. 下一篇AFNetworking二次封装的那些事

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目