iOS 网络编程 (七)AFNetworking 3.1.0 使用

AFNetworking从3.0.0版本移移除了NSURLConnection的使用,而是使用NSURLSession实现网络请求。

AFNetworking属于第三方框镜,需要将其源码导入工程。两种方法:

1 直接下载,将源码导入工程。还需导入一些系统库。

2 通过CocoaPods帮忙管理和下载。(推荐使用)

我是通过CocoaPods下载的3.1.0版本的。使用方法如下:

#define XMGBoundary @"520it"
#define XMGEncode(string) [string dataUsingEncoding:NSUTF8StringEncoding]
#define XMGNewLine [@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]

#import "ViewController.h"
#import "AFNetworking.h"
@interface ViewController ()
@property (weak, nonatomic) IBOutlet UILabel *label;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    [self uplod];
}
- (void)get{
    AFHTTPSessionManager *afHttpSessionManager = [AFHTTPSessionManager manager];
    NSDictionary *params = @{
                             @"username" : @"520it",
                             @"pwd" : @"520it"
                             };
    //afHttpSessionManager.responseSerializer = [AFXMLParserResponseSerializer serializer];
//    1. 需要注意的是,默认提交请求的数据是二进制的,返回格式是JSON
//    
//       如果提交数据是JSON的,需要将请求格式设置为AFJSONRequestSerializer
//       如果返回格式不是JSON的,
//    
//    请求格式 requestSerializer
//    
//    AFHTTPRequestSerializer            二进制格式
//    AFJSONRequestSerializer            JSON
//    AFPropertyListRequestSerializer    PList(是一种特殊的XML,解析起来相对容易)
//    
//    返回格式  responseSerializer
//    
//    AFHTTPResponseSerializer           二进制格式
//    AFJSONResponseSerializer           JSON
//    AFXMLParserResponseSerializer      XML,只能返回XMLParser,还需要自己通过代理方法解析
//    AFXMLDocumentResponseSerializer (Mac OS X)
//    AFPropertyListResponseSerializer   PList
//    AFImageResponseSerializer          Image
//    AFCompoundResponseSerializer       组合

    [afHttpSessionManager GET:@"http://120.25.226.186:32812/login" parameters:params progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        NSLog(@"get success:%@",responseObject);
        //回调是在主线程中,可以直接更新UI
        self.label.text = @"success";
        NSLog(@"%@", [NSThread currentThread]); //<NSThread: 0x14e27e80>{number = 1, name = main}
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        NSLog(@"get failure:%@",error);
    }];
}

- (void)post1{
    AFHTTPSessionManager *sessionManager = [AFHTTPSessionManager manager];
    NSDictionary *params = @{
                             @"username" : @"520it",
                             @"pwd" : @"520it"
                             };
    [sessionManager POST:@"http://120.25.226.186:32812/login" parameters:params progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        NSLog(@"post success:%@",responseObject);
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        NSLog(@"post failure:%@",error);
    }];
    
}

- (void)post2{
    AFHTTPSessionManager *sessionManager = [AFHTTPSessionManager manager];
    NSDictionary *params = @{
                             @"username" : @"520it",
                             @"pwd" : @"520it",
                             };
    
    [sessionManager POST:@"http://120.25.226.186:32812/login" parameters:params constructingBodyWithBlock:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        NSLog(@"post success:%@",responseObject);
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        NSLog(@"post failure:%@",error);
    }];
}

- (void)download{
    NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
    AFURLSessionManager *urlSessionManager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration];
    
    NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/resources/videos/minion_01.mp4"];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    NSURLSessionDownloadTask *task = [urlSessionManager downloadTaskWithRequest:request progress:^(NSProgress * _Nonnull downloadProgress) {
        //fractionCompleted 下载的比列
        NSLog(@"progress:%f completed:%lld,totalcount:%lld",downloadProgress.fractionCompleted,downloadProgress.completedUnitCount,downloadProgress.totalUnitCount);
    } destination:^NSURL * _Nonnull(NSURL * _Nonnull targetPath, NSURLResponse * _Nonnull response) {
        //下载完成才会走这里。
        // 指定下载文件保存的路径
        NSLog(@"%@ %@", targetPath, response.suggestedFilename);
        // 将下载文件保存在缓存路径中
        NSString *cacheDir = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0];
        NSString *path = [cacheDir stringByAppendingPathComponent:response.suggestedFilename];
        NSURL *fileURL = [NSURL fileURLWithPath:path];
        NSLog(@"file url:%@", fileURL);
        
        return fileURL;
    } completionHandler:^(NSURLResponse * _Nonnull response, NSURL * _Nullable filePath, NSError * _Nullable error) {
        NSLog(@"%@ %@", filePath, error);
    }];
    [task resume];
}

- (void)uplod{
    NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
    AFURLSessionManager *urlSessionManager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration];
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://120.25.226.186:32812/upload"]];
    request.HTTPMethod = @"POST";
    
    // 设置请求头(告诉服务器,这是一个文件上传的请求)
    [request setValue:[NSString stringWithFormat:@"multipart/form-data; boundary=%@", XMGBoundary] forHTTPHeaderField:@"Content-Type"];
    
    // 设置请求体
    NSMutableData *body = [NSMutableData data];
    
    // 文件参数
    // 分割线
    [body appendData:XMGEncode(@"--")];
    [body appendData:XMGEncode(XMGBoundary)];
    [body appendData:XMGNewLine];
    
    // 文件参数名
    [body appendData:XMGEncode([NSString stringWithFormat:@"Content-Disposition: form-data; name=\"file\"; filename=\"test.png\""])];
    [body appendData:XMGNewLine];
    
    // 文件的类型
    [body appendData:XMGEncode([NSString stringWithFormat:@"Content-Type: image/png"])];
    [body appendData:XMGNewLine];
    
    // 文件数据
    [body appendData:XMGNewLine];
    [body appendData:[NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"test" ofType:@"png"]]];
    [body appendData:XMGNewLine];
    
    // 结束标记
    /*
     --分割线--\r\n
     */
    [body appendData:XMGEncode(@"--")];
    [body appendData:XMGEncode(XMGBoundary)];
    [body appendData:XMGEncode(@"--")];
    [body appendData:XMGNewLine];
    NSURLSessionUploadTask *task = [urlSessionManager uploadTaskWithRequest:request fromData:body progress:^(NSProgress * _Nonnull uploadProgress) {
        NSLog(@"progress:%f completed:%lld,totalcount:%lld",uploadProgress.fractionCompleted,uploadProgress.completedUnitCount,uploadProgress.totalUnitCount);
    } completionHandler:^(NSURLResponse * _Nonnull response, id  _Nullable responseObject, NSError * _Nullable error) {
        NSLog(@"completion responseObject:%@",responseObject);
    }];
    [task resume];
}
@end

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值