开篇语:
前两篇文章介绍了YTKNetwork的简单封装,只给出了HXGetRequest类的实现,相信大家也照葫芦画瓢写了HXPostRequest类。嗯,我这里只是想介绍,如何让你的HXPostRequest支持文件上传。
实现:
如果你是按照官网教程的使用方法,你需要写一个UploadImageApi类,然后重写 constructingBodyBlock 方法。它的作用是在POST方法中提供一个设置HTTP body的地方。而它传递的数据格式是AFMultipartFormData,这个我们并不陌生,它就是AFNetworking类里定义的。是不是一下子变的非常亲切?
让我们看看HXPostRequest的简单实现:
#import "HXRequest.h"
@interface HXPostRequest : HXRequest
/**
POST 请求
@param url 网址
@param argument 参数
@return HXRequest
*/
- (id)initWithRequestUrl:(NSString *)url argument:(id)argument;
/**
POST 请求
@param url 网址
@param argument 参数
@param block 支持附件
@return HXRequest
*/
- (id)initWithRequestUrl:(NSString *)url argument:(id)argument constructingBodyBlock:(nullable AFConstructingBlock)block;
@end
#import "HXPostRequest.h"
@implementation HXPostRequest
- (id)initWithRequestUrl:(NSString *)url argument:(id)argument {
return [self initWithRequestUrl:url argument:argument constructingBodyBlock:nil];
}
- (id)initWithRequestUrl:(NSString *)url argument:(id)argument constructingBodyBlock:(nullable AFConstructingBlock)block{
self = [super init];
if (self) {
self.requestUrl = url;
self.requestArgument = argument;
self.constructingBodyBlock = block;//直接赋值过去即可
}
return self;
}
- (YTKRequestMethod)requestMethod {
return YTKRequestMethodPOST;
}
@end
使用的时候也非常简单:
HXPostRequest *uploadRequest = [[HXPostRequest alloc] initWithRequestUrl:@"api/uploadfile" argument:nil constructingBodyBlock:^(id<AFMultipartFormData> _Nonnull formData) {
//把所有要上传的文件都加进去
for (NSURL * tempFileUrl in self.fileUrls) {
[formData appendPartWithFileURL:tempFileUrl name:@"files" error:nil];
}
}];
[uploadRequest startWithCompletionBlockWithSuccess:^(__kindof HXRequest *request, NSDictionary *result, BOOL success) {
if (success) {
//上传成功
}else
{
//失败
}
} failure:^(__kindof HXRequest *request, NSString *errorInfo) {
//报错
NSLog(@"%@",errorInfo);
}];