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