利用cocoaPods安装AFNetworking比较方便: http://blog.csdn.net/nlynn/article/details/49705101
创建AFN管理者
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
默认请求二进制
默认响应是JSON
告诉AFN,支持接受 text/x
[AFJSONResponseSerializer serializer].acceptableContentTypes = [NSSet
setWithObject:@"text/xml"];
告诉AFN如何解析数据
告诉AFN客户端, 将返回的数据当做JSON来处理,默认的是以JSON处理
manager.responseSerializer = [AFJSONResponseSerializer serializer];
告诉AFN客户端, 将返回的数据当做XML来处理
manager.responseSerializer = [AFXMLParserResponseSerializer serializer];
告诉AFN客户端, 服务器返回什么就是什么
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
1. 判断网络环境, 比如说你要播放视频的时候可以提醒用户: 您确定要使用3g网络播放视频吗, 还是切换到wifi?
#pragma mark -- 判断网络环境
- (void)reach
{
/*
AFNetworkReachabilityStatusUnknown = -1, 未识别
AFNetworkReachabilityStatusNotReachable = 0, 未连接
AFNetworkReachabilityStatusReachableViaWWAN = 1, 3G
AFNetworkReachabilityStatusReachableViaWiFi = 2, wifi
*/
AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager];
// 提示:要监控网络连接状态,必须要先调用单例的startMonitoring方法
[manager startMonitoring];
// 发生变化时
[manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
// status 枚举值, 如上面的注释
NSLog(@"%ld", status);
}];
}
#pragma mark -- get请求
- (void)getjson
{
// AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
// [manager GET:kActivityList parameters:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nonnull responseObject) {
// NSLog(@"%@", responseObject); // 这个接口的类型是 text/html
// } failure:^(NSURLSessionDataTask * _Nonnull task, NSError * _Nonnull error) {
// NSLog(@"-----%@", error);
// }];
NSString *string = [kSearchURL stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
NSLog(@"%@", string);
NSURL *URL = [NSURL URLWithString:kActivityList];
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
manager.requestSerializer = [AFHTTPRequestSerializer serializer];
[manager GET:URL.absoluteString parameters:nil success:^(NSURLSessionTask *task, id responseObject) {
NSLog(@"JSON: %@", responseObject);
/// 解析出来的model
// NSDictionary *bigDic = responseObject;
} failure:^(NSURLSessionTask *operation, NSError *error) {
NSLog(@"Error: %@", error);
}];
}
- (void)post
{
// 1.创建AFN管理者
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
// 2.利用AFN管理者发送请求
NSDictionary *params = @{
@"date" : @"20151102",
@"startRecord" : @"1",
@"len" : @"30",
@"udid" : @"1234567890",
@"terminalType" : @"Iphone",
@"cid" : @"213"
};
// date=20151102&startRecord=1&len=30&udid=1234567890&terminalType=Iphone&cid=213
[manager POST:kNewsListURL parameters:params success:^
(NSURLSessionDataTask *task, id responseObject) {
NSLog(@"请求成功---%@", responseObject);
} failure:^(NSURLSessionDataTask *task, NSError *error) {
NSLog(@"请求失败---%@", error);
}];
}
#pragma mark -- 文件下载
// 执行下载文件的方法,可以监控下载进度
- (void)downLoadMonitor
{
// 1.创建网络管理者
// AFHTTPSessionManager 基于NSURLSession
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
// NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
// 2.利用网络管理者下载数据
// 视频的网址
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:kImageURL]];
/*
destination
- targetPath: 系统给我们自动写入的文件路径
- block的返回值, 要求返回一个URL, 返回的这个URL就是剪切的位置的路径
completionHandler
- url :destination返回的URL == block的返回的路径
*/
/*
@property int64_t totalUnitCount; 需要下载文件的总大小
@property int64_t completedUnitCount; 当前已经下载的大小
*/
NSProgress *progress = nil;
NSURLSessionDownloadTask *downTask = [manager downloadTaskWithRequest:request progress:&progress destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) {
// 缓存文件,如果想将缓存文件存到磁盘 SDURLCache
NSString *cachesPath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
NSString *path = [cachesPath stringByAppendingPathComponent:response.suggestedFilename];
NSLog(@"%@", path);
return [NSURL fileURLWithPath:path];
} completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) {
NSLog(@"%@",filePath.absoluteString);
}];
/*
要跟踪进度,需要使用 NSProgress,是在 iOS 7.0 推出的,专门用来跟踪进度的类!
NSProgress只是一个对象!如何跟踪进度!-> KVO 对属性变化的监听!
@property int64_t totalUnitCount; 总单位数
@property int64_t completedUnitCount; 完成单位数
*/
// 给Progress添加监听 KVO
[progress addObserver:self forKeyPath:@"completedUnitCount"
options:NSKeyValueObservingOptionNew context:nil];
// 启动任务
[downTask resume];
}
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
NSLog(@"%@", change);
}
#pragma mark -- 文件上传
- (void)upload
{
// 1.创建网络管理者
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
// 2.利用网络管理者上传数据
NSDictionary *dict = @{@"username":@"Syl"};
// formData: 专门用于拼接需要上传的数据
[manager POST:@"http://120.25.226.186:32812/upload" parameters:dict
constructingBodyWithBlock:
^void(id formData) {
/*
Data: 需要上传的数据
name: 服务器参数的名称
fileName: 文件名称
mimeType: 文件的类型
*/
UIImage *image =[UIImage imageNamed:@"hetu"];
NSData *data = UIImagePNGRepresentation(image);
[formData appendPartWithFileData:data name:@"file" fileName:@"hetu.png"
mimeType:@"image/png"];
/*
NSURL *url = [NSURL fileURLWithPath:@"/Users/apple/Desktop/
CertificateSigningRequest.certSigningRequest"];
// 任意的二进制数据MIMEType application/octet-stream
// [formData appendPartWithFileURL:url name:@"file" fileName:@"abc.cer"
mimeType:@"application/octet-stream" error:nil];
[formData appendPartWithFileURL:url name:@"file" error:nil];
*/
} success:^void(NSURLSessionDataTask * task, id responseObject) {
// 请求成功
NSLog(@"请求成功 %@", responseObject);
} failure:^void(NSURLSessionDataTask * task, NSError * error) {
// 请求失败
NSLog(@"请求失败 %@", error);
}];
}