/*(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 ofAFHTTPResponseSerializer
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;
}
}];
}