AFNetworking

/*(http)get请求和post请求的区别:
*1、post请求 请求地址和参数分离,比get更加安全 get请求的参数 直接暴漏在外面 不安全
*2、get请求只能获取服务器的数据(下载数据/提交参数) 不能上传文件,而post两者都可以
*3、get请求在浏览器中字符串长度最大限制为1024,post 没有限制
*4、post 上传文件 文件大小不能超过4G
*/

AFNetworking 目前使用比较多得一个下载库 目前一直在维护更新,使用的是非常简单 不需要添加任何关联的库
1.带block形式 内部是任务队列进行下载 就是对operation的一个封装下载
2.还对uikit 内部的类进行 类别形式添加方法(异步下载图片)
3.还可以检测网络状态

ASI 以前使用比较多得一个下载开源库 现在已经不维护了,ASI 使用的时候要导入很多库 比较麻烦
*/

/**
* 常规的AFN网络访问通过AFHTTPRequestOperationManager对象:AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
* AFNetworking 默认提交请求的数据是二进制数据,返回格式是JSON格式数据
* 如果提交数据是JSON的, 需要将请求格式设置为AFJSONRequestSerializer

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

  • 返回格式:

  • AFHTTPResponseSerializer 二进制格式
  • AFJSONResponseSerializer JSON
  • AFXMLParserResponseSerializer XML,只能返回XMLParser,还需要自己通过代理方法解析
  • AFXMLDocumentResponseSerializer (Mac OS X)
  • AFPropertyListResponseSerializer Plist
  • AFImageResponseSerializer Image
  • AFCompoundResponseSerializer 组合
  • 如果服务端的响应体的格式是application/json那么AFNetworking可以直接进行解析, 如果不是,要对AFNetworking的响应序列进行设置:
    manager.responseSerializer = [AFHTTPResponseSerializer serializer]; 这句代码将一个新的解析对象AFHTTPResponseSerializer赋值过去,数据不会再被AFNetworking自动解析
    manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@”…”];
    可以进入AFURLResponseSerialization的init方法查看其默认格式:
    self.acceptableContentTypes = [NSSet setWithObjects:@”application/json”, @”text/json”, @”text/javascript”, nil];
    AFNetworking自己的解释:
    AFJSONResponseSerializer is a subclass of AFHTTPResponseSerializer that validates and decodes JSON responses.
    By default, AFJSONResponseSerializer accepts the following MIME types, which includes the official standard, application/json, as well as other commonly-used types:
  • application/json
  • text/json
  • text/javascript
    http://stackoverflow.com/questions/477816/what-is-the-correct-json-content-type

  • 取消任务: [manager.operationQueue cancelAllOperations];
    */
    //————————————————————–
    //AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
    //请求体的格式制定
    //manager.requestSerializer = [AFJSONRequestSerializer serializer];

//制定返回的二进制数据,AFNetworking如何解析,默认是JSON解析
//制定AFHTTPResponseSerializer 直接返回给我二进制数据
//manager.responseSerializer

//AFNetworking 能够接受的数据类型,
//HTTP协议中的 Content-Type

//@”application/json”, @”text/json”, @”text/javascript”, nil];
//manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@”application/json”, @”text/json”, @”text/javascript”,@”text/html”,@”text/xml”,@”image/gif” nil];

//

GET请求数据

代码如下:
//导入头文件

#import <AFNetworking/AFNetworking.h>
-(void)getMethod{
    //取得请求操作的manager
    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
    //响应序列化
    manager.responseSerializer = [AFHTTPResponseSerializer serializer];
    //设置服务器响应内容的类型
    manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"text/html", nil];
    NSString *path = @"http://www.weather.com.cn/data/cityinfo/101010100.html";
    [manager GET:path parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
        NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableContainers error:nil];

    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog(@"error = %@",error.localizedDescription);
    }];
}

POST请求数据

示例代码如下:
//导入头文件

#import <AFNetworking/AFNetworking.h>
-(void)postMethd{
    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
    //设置响应序列化是为了不让manager对请求数据进行自动解析,不解析返回的responseObject对象类型则为data类型,自动解析为字典或者数组
    manager.responseSerializer = [AFHTTPResponseSerializer serializer];
    //设置服务器响应内容的类型
  manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"text/html", nil];

    NSString *url = @"http://10.0.8.8/sns/my/login.php";
    NSDictionary *dict = @{@"username":@"leaf_s",@"password":@"111111"};

//    parameters:";
    [manager POST:url parameters:dict success:^(AFHTTPRequestOperation *operation, id responseObject) {
        NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableContainers error:nil];

    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog(@"%@",error.localizedDescription);
    }];
}

下载文件

导入头文件

#import <AFNetworking/AFNetworking.h>
#import <AFNetworking/UIKit+AFNetworking.h>

示例代码如下:

-(void)downloadFile{
    //创建sessionManager对象
    AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
    NSString *path = @"http://imgcache.qq.com/club/item/avatar/zip/7/i87/all.zip";
    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:path]];
    //进度类,指向第三方库内部的进度类
    NSProgress *progress = nil;
    //download task
    NSURLSessionDownloadTask *downloadTask = [manager downloadTaskWithRequest:request progress:&progress destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) {
        //沙盒目录
        NSLog(@"home = %@",NSHomeDirectory());
        NSString *destPath = [NSString stringWithFormat:@"%@/Documents/temp.zip",NSHomeDirectory()];
        //返回保存文件的目录
        return [NSURL fileURLWithPath:destPath];
    } completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) {
        NSLog(@"error:=%@",error.localizedDescription);
    }];
    [downloadTask resume];

}

下载图片

导入头文件

#import <AFNetworking/AFNetworking.h>
#import <AFNetworking/UIKit+AFNetworking.h>

示例代码如下:

-(void)downloadImage{
    _iv = [[UIImageView alloc] initWithFrame:CGRectMake(50, 100, 150, 100)];
    [self.view addSubview:_iv];
    //第一种方式
//    [_iv setImageWithURL:[NSURL URLWithString:@"http://10.0.8.8/sns/my/headimage.php"]];
    //第二种可以从新赋予frame
    NSString *path = @"http://10.0.8.8/sns/my/headimage.php";
    __weak UIImageView *imgview = _iv;
    [_iv setImageWithURLRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:path]] placeholderImage:nil success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image) {
        //在这里可以重新改变imageView的位置和大小
        imgview.frame = CGRectMake(100, 100, image.size.width, image.size.height);
        imgview.image = image;
    } failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error) {
        NSLog(@"error=%@",error.localizedDescription);
    }];


}

其他请求示例

- (IBAction)GetJSON:(id)sender {
    AFHTTPRequestOperationManager * manager = [[AFHTTPRequestOperationManager alloc]init];
    [manager GET:JSON_TEST_URL parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
        NSLog(@"%@",responseObject);
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {

    }];
}
- (IBAction)GetXML:(id)sender {
    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
    //告诉AFNetworking 不需要它给我解析,返回给我最原始的二进制文件
    manager.responseSerializer = [AFHTTPResponseSerializer serializer];

    //告诉AFNetworking,可以接受text/xml 格式的文档类型
    manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/xml"];

    [manager GET:XML_TEST_URL parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
        NSLog(@"%@",responseObject);
        //得到二进制数据后通常使用GData进行xml解析

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

    }];
}
- (IBAction)POSTRegist:(id)sender {
    NSDictionary *dictionay = @{@"username":@"lijinghua1122",@"password":@"123456",@"email":@"lijinghua1122@qianfeng.com"};

    AFHTTPRequestOperationManager *manager = [[AFHTTPRequestOperationManager alloc]init];

    manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"];

    [manager POST:kRegisterUrl parameters:dictionay success:^(AFHTTPRequestOperation *operation, id responseObject) {
        NSLog(@"%@",responseObject);
        NSDictionary *dic = (NSDictionary*)responseObject;
        NSLog(@"%@",dic[@"code"]);
        NSLog(@"%@",dic[@"message"]);
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog(@"%@",error);
    }];
}
- (IBAction)POSTLogin:(id)sender {

    NSDictionary *dictionary = @{@"username":@"lijinghua1122",@"password":@"123456"};
    AFHTTPRequestOperationManager *manager = [[AFHTTPRequestOperationManager alloc]init];

    manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"];
    [manager POST:kLoginUrl parameters:dictionary success:^(AFHTTPRequestOperation *operation, id responseObject) {
        NSLog(@"%@",responseObject);
        NSLog(@"%@",responseObject[@"message"]);
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog(@"%@",error);
    }];
}
//http://blog.csdn.net/MSPinyin/article/details/6141638
- (IBAction)uploadImage:(id)sender {
   //multipart/form-data 可以一次性的提交多个表单数据,数据可以是文件,也可以是普通的文本数据
    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
    manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"];

    [manager POST:kUploadImageUrl parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
        //1:直接把数据追加到formData上的方式
        //这里个构建表单数据
        UIImage *image = [UIImage imageNamed:@"test.png"];
        //把UIImage转换为NSData
        NSData *data = UIImagePNGRepresentation(image);

        [formData appendPartWithFileData:data name:@"headimage" fileName:@"headimage" mimeType:@"image/png"];

        //2:再formData表单中追加文件路径的方式
//        NSString *filePath = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"png"];
//        NSURL *fileURL = [NSURL fileURLWithPath:filePath];
//        [formData appendPartWithFileURL:fileURL name:@"headimage" error:nil];

    } success:^(AFHTTPRequestOperation *operation, id responseObject) {
        //上传成功
        NSLog(@"%@",responseObject);
        NSLog(@"%@",responseObject[@"message"]);
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        //失败
        NSLog(@"%@",error);
    }];


}
//AFNetworkReachabilityStatusUnknown          = -1,
//AFNetworkReachabilityStatusNotReachable     = 0,
//AFNetworkReachabilityStatusReachableViaWWAN = 1,
//AFNetworkReachabilityStatusReachableViaWiFi = 2,

- (IBAction)netMonitor:(id)sender {
    [[AFNetworkReachabilityManager sharedManager] startMonitoring];
    [[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
        switch (status) {
            case AFNetworkReachabilityStatusUnknown:
                NSLog(@"状态未知");
                break;
            case AFNetworkReachabilityStatusNotReachable:
                NSLog(@"网络不通");
                break;
            case AFNetworkReachabilityStatusReachableViaWWAN:
                NSLog(@"网络为2G/3G");
                break;
            case AFNetworkReachabilityStatusReachableViaWiFi:
                NSLog(@"网络为WIFI");
                break;
            default:
                break;
        }
    }];
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值