AFNetWorking的使用方法

本文详细介绍了AFNetworking库的使用方法,包括请求格式、返回格式、网络状态监测及发送GET、POST、上传和下载请求的具体实现。同时,展示了如何判断网络连接状态并提供了发送不同类型的网络请求实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

AFN需要注意的是,默认提交请求的数据是二进制的,返回格式是JSON

请求格式

AFHTTPRequestSerializer            二进制格式
AFJSONRequestSerializer            JSON格式
AFPropertyListRequestSerializer    PList(是一种特殊的XML,解析起来相对容易)


返回格式

AFHTTPResponseSerializer           二进制格式
AFJSONResponseSerializer           JSON格式
AFXMLParserResponseSerializer      XML,只能返回XMLParser,还需要自己通过代理方法解析
AFXMLDocumentResponseSerializer (Mac OS X)
AFPropertyListResponseSerializer   PList格式
AFImageResponseSerializer          Image格式
AFCompoundResponseSerializer       组合格式

//网络监测
//AFN提供了四种网络状态:
/*
AFNetworkReachabilityStatusUnknown = -1, // 未知
AFNetworkReachabilityStatusNotReachable = 0, // 无连接
AFNetworkReachabilityStatusReachableViaWWAN = 1, // 3G 花钱
AFNetworkReachabilityStatusReachableViaWiFi = 2, // 局域网络,不花钱
*/

//判断网络连接状态的方法:
- (void)netWorkStatues
{
//创建AFNetworkReachabilityManager
//AFNetworkReachabilityManager *manager = [[AFNetworkReachabilityManager alloc] init];

//获得AFNetworkReachabilityManager
AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager];


//开启网络监测
[manager startMonitoring];

//监测到网络状态更改后的block回调
[manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {

    switch (status)
    {
        case -1:
        {
            //未知网络
            NSLog(@"当前网络为 未知网络");
        }
            break;
        case 0:
        {
            //无网络
            NSLog(@"当前无网络连接");
        }
            break;

        case 1:
        {
            //移动网络
            NSLog(@"当前网络为 蜂窝移动网络");
        }
            break;

        case 2:
        {
            //WiFi
            NSLog(@"当前网络为 无线网络");
        }
            break;


        default:
            break;
    }

}];

}

//发送GET请求
//所有的网络请求都是由AFHTTPRequestOperationManager发起的

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];

NSString *urlStr = @"http://localhost:8080/RoyLoginAndRegisterService/LoginAndRegisterServlet";

//假如URL有中文需要编码(ios 9.0 以前可用)
//NSString *encodeStr = [urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

//iOS 9.0以后可用的编码方法
// NSString *encodeStr = [urlStr stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];

//1,假如提交的数据格式不是二进制,需要申明请求的数据格式
//申明请求的数据格式,默认二进制格式

// manager.requestSerializer = [AFHTTPRequestSerializer serializer];

//假如请求的数据格式是json
//manager.requestSerializer = [AFJSONRequestSerializer serializer];

//2,获取的数据格式默认支持json,所以假如获取的数据格式不是json,需要申明一下

//申明获取的数据格式为二进制格式
manager.responseSerializer = [AFHTTPResponseSerializer serializer];

//添加一种可以接受的数据格式
//manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"text/html", nil];

//设置请求头
//[manager.requestSerializer setValue:@"image/jpg" forHTTPHeaderField:@"Content-Type"];

/*
 //1,无参数的get请求

//发送get请求的方法
//第一个参数:请求的资源路径(URL)的字符串
//第二个参数:请求的参数
//第三个参数:成功后的回调
//第四个参数:失败后的回调
[manager GET:urlStr parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {

    NSLog(@"请求成功了 %@",operation.responseString);

} failure:^(AFHTTPRequestOperation *operation, NSError *error) {

    NSLog(@">>>>>> %@",operation.responseString);

    NSLog(@"请求失败了:%@",error.localizedDescription);
}];
*/


//2,有参数的get请求

//AFN的get请求,参数是按照键值的方式存放在以一个字典,请求的parameters参数就是这个参数字典
NSDictionary *parameterDic = @{@"name":@"roy",@"psw":@"123456",@"command":@"1"};

[manager GET:urlStr parameters:parameterDic success:^(AFHTTPRequestOperation *operation, id responseObject) {

    NSLog(@"====== %@",operation.responseString);

} failure:^(AFHTTPRequestOperation *operation, NSError *error) {

     NSLog(@"error ====== %@",error.localizedDescription);
}];

//发送POST请求
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];

//申明一下接收的数据格式为二进制数据
manager.responseSerializer = [AFHTTPResponseSerializer serializer];

NSString *urlStr = @"http://localhost:8080/RoyLoginAndRegisterService/LoginAndRegisterServlet";

//1,普通的表单数据

//post请求的参数部分也是按照键值进行上传的
 NSDictionary *parameterDic = @{@"name":@"roy",@"psw":@"123456",@"command":@"1"};


//发送post请求
[manager POST:urlStr parameters:parameterDic success:^(AFHTTPRequestOperation *operation, id responseObject) {

    NSLog(@">>>>>>> %@",operation.responseString);

} failure:^(AFHTTPRequestOperation *operation, NSError *error) {

    NSLog(@"err === %@",error.localizedDescription);
}];


// 2,multi-part 数据请求(不光是表单参数,还有额外的文件数据,比如新浪微博的发送微博和图片的接口)

UIImage *image = [UIImage imageNamed:@"xxx.png"];

NSData *imgData = UIImagePNGRepresentation(image);

//第一个block块提供了一个AFMultipartFormData参数,就是用来提交额外文件数据(multi-part)的参数
[manager POST:urlStr parameters:parameterDic constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {

    //往formData参数后边追加额外的文件数据
    //第一个参数:文件数据
    //第二个参数:上传的文件数据,对应服务器请求参数的字段名
    //第三个参数:上传的文件名。注意:文件名不可为空,并且最好文件的后缀不要省去,后缀根据上传的文件格式而定
    //第四个参数:上传文件的格式,不可为空。参考请求头的Content-Type字段。比如:image/jpg
    [formData appendPartWithFileData:imgData name:@"pic" fileName:@"xxx.png" mimeType:@"image/png"];

    //[formData appendPartWithFormData:<#(NSData *)#> name:<#(NSString *)#>]


} success:^(AFHTTPRequestOperation *operation, id responseObject) {

} failure:^(AFHTTPRequestOperation *operation, NSError *error) {

}];

}

//上传请求UPLOAD
//创建AFHTTPSessionManager
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];

//[manager.requestSerializer setValue:@"image/png" forHTTPHeaderField:@"Content-Type"];

//申明获取的数据格式
manager.responseSerializer = [AFHTTPResponseSerializer serializer];

NSURL *url = [NSURL URLWithString:@"http://localhost:8080/RoyUploadFileServer/RoyUploadServlet"];

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

//设置请求的方式(必填)
[request setHTTPMethod:@"POST"];

NSString *filePath = [[NSBundle mainBundle] pathForResource:@"123" ofType:@"mp4"];

NSData *imgData = [NSData dataWithContentsOfFile:filePath];

//设置执行上传任务时回调的block,在这个回调里边可以获取上传的进度信息
[manager setTaskDidSendBodyDataBlock:^(NSURLSession *session, NSURLSessionTask *task, int64_t bytesSent, int64_t totalBytesSent, int64_t totalBytesExpectedToSend) {


    //回到主队列,进行进度刷新
    dispatch_async(dispatch_get_main_queue(), ^{

        _slider.value = (float)totalBytesSent/totalBytesExpectedToSend;

    });



    NSLog(@"当前线程是%@",[[NSThread currentThread] isMainThread]?@"主线程":@"分线程");

}];

//upload请求,并且获取上传的任务
//第一个参数:请求对象
//第二个参数:上传的数据
//第三个参数:进度信息
//第四个参数:结束的回调block

NSURLSessionUploadTask *uploadTask = [manager uploadTaskWithRequest:request fromData:imgData progress:nil completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) {

   //把response转化为NSHTTPURLResponse类型
   NSHTTPURLResponse *newResponse = (NSHTTPURLResponse *)response;

   NSLog(@">>>>> %d  %@ %@",newResponse.statusCode,responseObject,error.localizedDescription);

   NSLog(@"====== %@",[[NSString alloc] initWithData:(NSData *)responseObject encoding:NSUTF8StringEncoding]);

}];

//[manager uploadTaskWithRequest:<#(NSURLRequest *)#> fromFile:<#(NSURL *)#> progress:<#(NSProgress *__autoreleasing *)#> completionHandler:<#^(NSURLResponse *response, id responseObject, NSError *error)completionHandler#>]



//开始执行任务
[uploadTask resume];

//下载DOWNLOAD请求
/*
这样也可以进行下载任务
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];

[manager downloadTaskWithRequest:<#(NSURLRequest *)#> progress:<#(NSProgress *__autoreleasing *)#> destination:<#^NSURL *(NSURL *targetPath, NSURLResponse *response)destination#> completionHandler:<#^(NSURLResponse *response, NSURL *filePath, NSError *error)completionHandler#>]
 */
NSURL *url = [NSURL URLWithString:@"http://localhost:8080/RoyUploadFileServer/ybsh.mov"];

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

//创建AFHTTPRequestOperation,并且初始化请求
AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];

NSString *filePath = [NSString stringWithFormat:@"%@/Documents/download.mov",NSHomeDirectory()];

NSLog(@"filePath === %@",filePath);

// 设置文件保存路径
[operation setOutputStream:[NSOutputStream outputStreamToFileAtPath:filePath append:YES]];

[operation setDownloadProgressBlock:^(NSUInteger bytesRead, long long totalBytesRead, long long totalBytesExpectedToRead) {

     NSLog(@"当前线程是%@",[[NSThread currentThread] isMainThread]?@"主线程":@"分线程");

    _slider.value = (float)totalBytesRead / totalBytesExpectedToRead;

}];

//设置操作执行结束后的回调block
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {

    NSLog(@"下载成功了");

} failure:^(AFHTTPRequestOperation *operation, NSError *error) {

    NSLog(@"下载失败了");
}];

//开始执行操作
[operation start];
资源下载链接为: https://pan.quark.cn/s/22ca96b7bd39 在当今的软件开发领域,自动化构建与发布是提升开发效率和项目质量的关键环节。Jenkins Pipeline作为一种强大的自动化工具,能够有效助力Java项目的快速构建、测试及部署。本文将详细介绍如何利用Jenkins Pipeline实现Java项目的自动化构建与发布。 Jenkins Pipeline简介 Jenkins Pipeline是运行在Jenkins上的一套工作流框架,它将原本分散在单个或多个节点上独立运行的任务串联起来,实现复杂流程的编排与可视化。它是Jenkins 2.X的核心特性之一,推动了Jenkins从持续集成(CI)向持续交付(CD)及DevOps的转变。 创建Pipeline项目 要使用Jenkins Pipeline自动化构建发布Java项目,首先需要创建Pipeline项目。具体步骤如下: 登录Jenkins,点击“新建项”,选择“Pipeline”。 输入项目名称和描述,点击“确定”。 在Pipeline脚本中定义项目字典、发版脚本和预发布脚本。 编写Pipeline脚本 Pipeline脚本是Jenkins Pipeline的核心,用于定义自动化构建和发布的流程。以下是一个简单的Pipeline脚本示例: 在上述脚本中,定义了四个阶段:Checkout、Build、Push package和Deploy/Rollback。每个阶段都可以根据实际需求进行配置和调整。 通过Jenkins Pipeline自动化构建发布Java项目,可以显著提升开发效率和项目质量。借助Pipeline,我们能够轻松实现自动化构建、测试和部署,从而提高项目的整体质量和可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值