登录 立即注册
金钱:

Code4App-iOS开发-iOS 开源代码库-iOS代码实例搜索-iOS特效示例-iOS代码例子下载-Code4App.com

查看: 349|回复: 8

iOS开发 - AFNetworking网络请求,afnetworking原理

[复制链接]

327

主题

634

帖子

2543

金钱

手工艺人

发表于 2018-1-11 15:11:44 | 显示全部楼层 |阅读模式

        AFNetworking

        什么是AFN
全称是AFNetworking,是对NSURLConnection、NSURLSession的一层封装
虽然运行效率没有ASI高,但是使用比ASI简单
在iOS开发中,使用比较广泛

        


AFHTTPRequestOperationManager

        是AFN中最重要的对象之一
封装了HTTP请求的常见处理
GETPOST请求
解析服务器的响应数据

        创建

[Java] 查看源文件 复制代码
AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager];

GETPOST请求
[Java] 查看源文件 复制代码
//GET请求
- (AFHTTPRequestOperation *)GET: (NSString *)URLString
                     parameters: (id)parameters
                        success: (void (^)(AFHTTPRequestOperation *operation, id responseObject))success
                        failure: (void (^)(AFHTTPRequestOperation *operation, NSError *error))failure

//POST请求
- (AFHTTPRequestOperation *)POST: (NSString *)URLString
                      parameters: (id)parameters
                         success: (void (^)(AFHTTPRequestOperation *operation, id responseObject))success
                         failure: (void (^)(AFHTTPRequestOperation *operation, NSError *error))failure

文件上传
[Java] 查看源文件 复制代码
- (AFHTTPRequestOperation *)POST: (NSString *)URLString
                      parameters: (id)parameters
       constructingBodyWithBlock: (void (^)(id  formData))block
                         success: (void (^)(AFHTTPRequestOperation *operation, id responseObject))success
                         failure: (void (^)(AFHTTPRequestOperation *operation, NSError *error))failure

监控联网状态
[Java] 查看源文件 复制代码
AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager];
[manager startMonitoring];

[manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
    NSLog(#%d, status);
}];

        提示:要监控网络连接状态,必须要先调用单例的startMonitoring方法

        1.AFHTTPRequestOperationManager
* 对NSURLConnection的封装

        2.AFHTTPSessionManager
* 对NSURLSession的封装


对服务器返回数据的解析
[Java] 查看源文件 复制代码
1.AFN可以自动对服务器返回的数据进行解析
* 默认将服务器返回的数据当做JSON来解析

2.设置对服务器返回数据的解析方式
1> 当做是JSON来解析(默认做法)
* mgr.responseSerializer = [AFJSONResponseSerializer serializer];
* responseObject的类型是NSDictionary或者NSArray

2> 当做是XML来解析
* mgr.responseSerializer = [AFXMLParserResponseSerializer serializer];
* responseObject的类型是NSXMLParser

3> 直接返回data
* 意思是:告诉AFN不要去解析服务器返回的数据,保持原来的data即可
* mgr.responseSerializer = [AFHTTPResponseSerializer serializer];

3.注意
* 服务器返回的数据一定要跟responseSerializer对得上
1> 服务器返回的是JSON数据
* AFJSONResponseSerializer
* AFHTTPResponseSerializer

2> 服务器返回的是XML数据
* AFXMLParserResponseSerializer
* AFHTTPResponseSerializer

3> 服务器返回的是其他数据
* AFHTTPResponseSerializer

AFNetworking网络请求实例
[Java] 查看源文件 复制代码
#import AFNetworking.h

#implementation ViewController

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

- (void)touchesBegan: (NSSet *)touches withEvent: (UIEvent *)event
{
    [self postJSON];
}

- (void)getSession
{
    // AFHTTPSessionManager 对 NSURLSession 的封装
    AFHTTPSessionManager *mgr = [AFHTTPSessionManager manager];
    [mgr GET:# parameters:nil success:^(NSURLSessionDataTask *task, id responseObject) {

    } failure:^(NSURLSessionDataTask *task, NSError *error) {

    }];
}

/**
 *  利用AFN发送一个POST请求,服务器返回的JSON数据
 */
- (void)postJSON
{
    // AFHTTPRequestOperationManager 对 NSURLConnection的封装

    // 1.创建一个请求操作管理者
    AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager];

    // 2.请求参数
    NSMutableDictionary *params = [NSMutableDictionary dictionary];
    params[#username] = #哈哈哈;
    params[#pwd] = #123;

    // 3.发送一个GET请求
    NSString *url = #https://localhost:8080/MJServer/login;
    [mgr POST:url parameters:params
     success:^(AFHTTPRequestOperation *operation, id responseObject) {
         // 请求成功的时候调用这个block
         NSLog(#请求成功---%#, responseObject);
     } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
         // 请求失败的时候调用调用这个block
         NSLog(#请求失败);
     }];
}

/**
 *  利用AFN发送一个GET请求,服务器返回的JSON数据,让AFN直接返回data
 */
- (void)getData
{
    // 1.创建一个请求操作管理者
    AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager];
    // 声明:不要对服务器返回的数据进行解析,直接返回data即可
    // 如果是文件下载,肯定是用这个
    // responseObject的类型是NSData
    mgr.responseSerializer = [AFHTTPResponseSerializer serializer];

    // 2.请求参数
    NSMutableDictionary *params = [NSMutableDictionary dictionary];
    params[#username] = #哈哈哈;
    params[#pwd] = #123;

    // 3.发送一个GET请求
    NSString *url = #https://localhost:8080/MJServer/login;
    [mgr GET:url parameters:params
     success:^(AFHTTPRequestOperation *operation, id responseObject) {
         // 请求成功的时候调用这个block
         NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableLeaves error:nil];

         NSLog(#%#, dict);
     } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
         // 请求失败的时候调用调用这个block
         NSLog(#请求失败);
     }];
}

/**
 *  利用AFN发送一个GET请求,服务器返回的XML数据
 */
- (void)getXML
{
    // 1.创建一个请求操作管理者
    AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager];
    // 声明:等会服务器返回的是XML数据
    // responseObject的类型是NSXMLParser
    mgr.responseSerializer = [AFXMLParserResponseSerializer serializer];

    // 2.请求参数
    NSMutableDictionary *params = [NSMutableDictionary dictionary];
    params[#username] = #哈哈哈;
    params[#pwd] = #123;
    params[#type] = #XML;

    // 3.发送一个GET请求
    NSString *url = #https://localhost:8080/MJServer/login;
    [mgr GET:url parameters:params
     success:^(AFHTTPRequestOperation *operation, id responseObject) {
         // 请求成功的时候调用这个block
         NSLog(#请求成功--%#, responseObject);
//         responseObject.delegate = self;
//         [responseObject parse];
     } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
         // 请求失败的时候调用调用这个block
         NSLog(#请求失败);
     }];
}

/**
 *  利用AFN发送一个GET请求,服务器返回的JSON数据
 */
- (void)getJSON
{
    // 1.创建一个请求操作管理者
    AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager];
    // 声明一下:服务器返回的是JSON数据
    //    mgr.responseSerializer = [AFJSONResponseSerializer serializer];
    // responseObject的类型是NSDictionary或者NSArray

    // 2.请求参数
    NSMutableDictionary *params = [NSMutableDictionary dictionary];
    params[#username] = #哈哈哈;
    params[#pwd] = #123;

    // 3.发送一个GET请求
    NSString *url = #https://localhost:8080/Server/login;
    [mgr GET:url parameters:params
     success:^(AFHTTPRequestOperation *operation, id responseObject) {
         // 请求成功的时候调用这个block
         NSLog(#请求成功---%#, responseObject);
     } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
         // 请求失败的时候调用调用这个block
         NSLog(#请求失败);
     }];
}

#end

AFNetworking文件上传实例
[mw_shl_code=java,true]
#import AFNetworking.h

#interface ViewController ()
#property (weak, nonatomic) IBOutlet UIImageView *imageView;
- (IBAction)upload;
#end

#implementation ViewController

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

- (void)touchesBegan: (NSSet *)touches withEvent: (UIEvent *)event
{
    UIActionSheet *sheet = [[UIActionSheet alloc] initWithTitle:#请选择图片 delegate:self cancelButtonTitle:#取消 destructiveButtonTitle:nil otherButtonTitles:#拍照, #相册, nil];
    [sheet showInView:self.view.window];
}

#pragma mark - UIActionSheet
- (void)actionSheet: (UIActionSheet *)actionSheet clickedButtonAtIndex: (NSInteger)buttonIndex
{
    UIImagePickerController *ipc = [[UIImagePickerController alloc] init];
    // 设置代理
    ipc.delegate = self;

    switch (buttonIndex) {
        case 0: { // 拍照
            if (![UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) return;
            ipc.sourceType = UIImagePickerControllerSourceTypeCamera;
            break;
        }
        case 1: { // 相册
            if (![UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary]) return;
            ipc.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
            break;
        }
        default:
            break;
    }

    // 显示控制器
    [self presentViewController:ipc animated:YES completion:nil];
}

#pragma mark - UIImagePickerControllerDelegate
/**
*  在选择完图片后调用
*
*  #param info   里面包含了图片信息
*/
- (void)imagePickerController: (UIImagePickerController *)picker didFinishPickingMediaWithInfo: (NSDictionary *)info
{
    // 销毁控制器
    [picker dismissViewControllerAnimated:YES completion:nil];

    // 获得图片
    UIImage *image = info[UIImagePickerControllerOriginalImage];

    // 显示图片
    self.imageView.image = image;
}

- (void)upload1
{
    // 1.创建一个

21

主题

7156

帖子

2654

金钱

手工艺人

发表于 2018-1-11 15:14:43 | 显示全部楼层
小弟学习了~支持,支持

0

主题

7141

帖子

-525

金钱

限制会员

发表于 2018-1-11 15:15:35 | 显示全部楼层
帮帮顶顶!!

21

主题

7195

帖子

2619

金钱

手工艺人

发表于 2018-1-11 15:16:42 | 显示全部楼层
写的真的很不错

16

主题

7180

帖子

1435

金钱

手工艺人

发表于 2018-1-11 15:18:24 | 显示全部楼层
mark,收藏了

23

主题

7146

帖子

1048

金钱

iOS大神

Rank: 6Rank: 6

分享大神

发表于 2018-1-11 15:21:30 | 显示全部楼层
虽不明,但觉厉...

15

主题

7145

帖子

1700

金钱

手工艺人

发表于 2018-1-11 15:27:03 | 显示全部楼层
code4app确实是个好地方,必须支持~

0

主题

41

帖子

306

金钱

攻城狮

Rank: 3Rank: 3

发表于 2018-1-23 23:52:02 | 显示全部楼层
感谢分享,Code4App有你更精彩

0

主题

41

帖子

306

金钱

攻城狮

Rank: 3Rank: 3

发表于 2018-1-27 14:22:07 | 显示全部楼层
感谢分享,Code4App有你更精彩
*滑动验证:
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

关闭

每日头条

通过邮件订阅最新 Code4App 信息
上一条 /4 下一条

广告投放| Github|申请友链|手机版|Code4App ( 粤ICP备15117877号-1 )

快速回复 返回顶部 返回列表