网络编程(使用第三方框架和不使用第三方框架)
来源:互联网 发布:java ee eclipse教程 编辑:程序博客网 时间:2024/05/17 22:29
1.HTTP协议:全称为“超文本传输协议”,浏览器和服务器之间的通信方式
HTTP永远都是客户端发起请求,服务器回送响应
2.比较常用的请求方式有GET和POST请求,GET请求是向服务器索取数据的一种请求方式,GET请求时也可以发送数据;POST请求是向服务器提交数据的一种请求方式,比如用户登录等等,参数放在请求体中
3.GET与POST异同:GET带参数,参数拼接在URL地址后面?key=value&key=value,长度有限制,快;POST请求带参数,参数放在请求体中(body),相对安全,长度很大,相对来说慢;
4.HTTP请求主要由三部分组成:请求行,HTTP请求头,http请求体,post请求才有请求体
5HTTP响应主要由两部分组成:响应头,响应体;响应有个状态ma,表示响应的结果,200表示成功,404表示响应失败
一 1,不使用第三方框架
NSURLSession(ios7之后用的)
//五部曲1.构造URL,//2构造可变的Request对象, //3.构造Session会话 //4.构造Task任务 //5.发送任务
(1)GET请求
//1.构造URL, 参数直接拼接在url连接后,//GET请求, 也可以给服务器发送信息, 也有参数(微博用户名,用户id)
NSURL *url = [NSURL URLWithString:@"http://news-at.zhihu.com/api/3/news/4602734”];
NSURL *url = [NSURL URLWithString:@"http://news-at.zhihu.com/api/3/news/4602734”];
//2构造可变的Request对象
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
//(1)设置请求方式
[request setHTTPMethod:@"GET"];
//(2)超时时间
[request setTimeoutInterval:120];
//(3)缓存策略
[request setCachePolicy:NSURLRequestReturnCacheDataElseLoad];
//(1)设置请求方式
[request setHTTPMethod:@"GET"];
//(2)超时时间
[request setTimeoutInterval:120];
//(3)缓存策略
[request setCachePolicy:NSURLRequestReturnCacheDataElseLoad];
//告诉服务,返回的数据需要压缩
[request setValue:@"gzip" forHTTPHeaderField:@"Accept-Encoding"];
//(4)设置请求头其他内容
//[request setValue:<#(NSString *)#> forHTTPHeaderField:<#(NSString *)#>];//[request addValue:<#(NSString *)#> forHTTPHeaderField:<#(NSString *)#>];
//3.构造Session会话
NSURLSession *session = [NSURLSession sharedSession];
//4.构造Task任务
NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
if (error == nil) {
NSString *dataStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"data: %@", dataStr);
}
}];
//5.发送任务
[task resume];
NSURLSession *session = [NSURLSession sharedSession];
//4.构造Task任务
NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
if (error == nil) {
NSString *dataStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"data: %@", dataStr);
}
}];
//5.发送任务
[task resume];
2.post请求,和get请求差不多.post请求有请求体
//POST请求
//1.构造URL
NSURL *url = [NSURL URLWithString:@"https://api.weibo.com/2/statuses/update.json"];
//2.构造Request
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
//(1)设置为POST请求
[request setHTTPMethod:@"POST"];
//(2)超时
[request setTimeoutInterval:60];
//(3)设置请求头
//[request setAllHTTPHeaderFields:nil];
//(4)设置请求体
//发微博
//请求体里需要包含至少两个参数
//指定用户的令牌 微博正文
//access_token status
NSString *bodyStr = @"access_token=2.00TpCOFGgvN4eB4c8f6ca3cdBurugD&status=无限互联34班";
NSData *bodyData = [bodyStr dataUsingEncoding:NSUTF8StringEncoding];
[request setHTTPBody:bodyData];
//3.构造Session
NSURLSession *session = [NSURLSession sharedSession];
//4.task
NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
NSLog(@"response : %@", response);
}];
//5.发送任务
[task resume];
//1.构造URL
NSURL *url = [NSURL URLWithString:@"https://api.weibo.com/2/statuses/update.json"];
//2.构造Request
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
//(1)设置为POST请求
[request setHTTPMethod:@"POST"];
//(2)超时
[request setTimeoutInterval:60];
//(3)设置请求头
//[request setAllHTTPHeaderFields:nil];
//(4)设置请求体
//发微博
//请求体里需要包含至少两个参数
//指定用户的令牌 微博正文
//access_token status
NSString *bodyStr = @"access_token=2.00TpCOFGgvN4eB4c8f6ca3cdBurugD&status=无限互联34班";
NSData *bodyData = [bodyStr dataUsingEncoding:NSUTF8StringEncoding];
[request setHTTPBody:bodyData];
//3.构造Session
NSURLSession *session = [NSURLSession sharedSession];
//4.task
NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
NSLog(@"response : %@", response);
}];
//5.发送任务
[task resume];
二NSURLSessionDelegate
//1.url
NSURL *url = [NSURL URLWithString:@"http://news-at.zhihu.com/api/3/news/latest"];
//2.(request) configuration如果用配置对象就不需要使用request了
NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
/*
requestCachePolicy : 设置缓存策略
networkServiceType : 设置网络服务的类型:网络流量,网络电话,语音,视频..
timeoutIntervalForRequest:设置超时时间
HTTPAdditionalHeaders : 设置请求头
discretionary : 用于后台请求,会把WiFi和电量的可用性考虑在内
allowsCellularAccess : 是否允许使用蜂窝数据
*/
config.timeoutIntervalForRequest = 120;
config.allowsCellularAccess = NO;
//3.session
//NSURLSession *session = [NSURLSession sharedSession];
//通过配置config对象来创建session
//如果只是发送请求,使用以下方法, 系统会默认创建一个queue来处理session的消息
//NSURLSession *session = [NSURLSession sessionWithConfiguration:config];
NSOperationQueue *queue = [NSOperationQueue mainQueue];//或者不在主线程上也可以
//(1)配置对象
//(2)代理对象, 可以监测请求过程, 是强引用的(strong)
//(3)操作队列, 可以设定delegate在指定的queue上面执行代理方法
NSURLSession *session = [NSURLSession sessionWithConfiguration:config
delegate:self
delegateQueue:queue];
//4.task
NSURLSessionDataTask *task = [session dataTaskWithURL:url];
//5.resume
[task resume];
NSURL *url = [NSURL URLWithString:@"http://news-at.zhihu.com/api/3/news/latest"];
//2.(request) configuration如果用配置对象就不需要使用request了
NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
/*
requestCachePolicy : 设置缓存策略
networkServiceType : 设置网络服务的类型:网络流量,网络电话,语音,视频..
timeoutIntervalForRequest:设置超时时间
HTTPAdditionalHeaders : 设置请求头
discretionary : 用于后台请求,会把WiFi和电量的可用性考虑在内
allowsCellularAccess : 是否允许使用蜂窝数据
*/
config.timeoutIntervalForRequest = 120;
config.allowsCellularAccess = NO;
//3.session
//NSURLSession *session = [NSURLSession sharedSession];
//通过配置config对象来创建session
//如果只是发送请求,使用以下方法, 系统会默认创建一个queue来处理session的消息
//NSURLSession *session = [NSURLSession sessionWithConfiguration:config];
NSOperationQueue *queue = [NSOperationQueue mainQueue];//或者不在主线程上也可以
//(1)配置对象
//(2)代理对象, 可以监测请求过程, 是强引用的(strong)
//(3)操作队列, 可以设定delegate在指定的queue上面执行代理方法
NSURLSession *session = [NSURLSession sessionWithConfiguration:config
delegate:self
delegateQueue:queue];
//4.task
NSURLSessionDataTask *task = [session dataTaskWithURL:url];
//5.resume
[task resume];
#pragma mark - 代理方法
//1.服务器返回响应头,就会调用
- (void)URLSession:(NSURLSession *)session
dataTask:(NSURLSessionDataTask *)dataTask
didReceiveResponse:(NSURLResponse *)response
completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler
{
//
NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
NSLog(@"%ld", httpResponse.statusCode);
//接收到响应头,调用block,可以取消或者继续后面的数据传输
/*
NSURLSessionResponseCancel = 0, 取消后面的数据传输
NSURLSessionResponseAllow = 1, 继续传输
NSURLSessionResponseBecomeDownload = 2, 把加载数据的模式转换为下载
*/
//调用block
completionHandler(NSURLSessionResponseAllow);
}
//2.响应体数据全部接收的时候,调用
- (void)URLSession:(NSURLSession *)session
dataTask:(NSURLSessionDataTask *)dataTask
didReceiveData:(NSData *)data
{
//data 是接收到的响应体数据
}
//1.服务器返回响应头,就会调用
- (void)URLSession:(NSURLSession *)session
dataTask:(NSURLSessionDataTask *)dataTask
didReceiveResponse:(NSURLResponse *)response
completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler
{
//
NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
NSLog(@"%ld", httpResponse.statusCode);
//接收到响应头,调用block,可以取消或者继续后面的数据传输
/*
NSURLSessionResponseCancel = 0, 取消后面的数据传输
NSURLSessionResponseAllow = 1, 继续传输
NSURLSessionResponseBecomeDownload = 2, 把加载数据的模式转换为下载
*/
//调用block
completionHandler(NSURLSessionResponseAllow);
}
//2.响应体数据全部接收的时候,调用
- (void)URLSession:(NSURLSession *)session
dataTask:(NSURLSessionDataTask *)dataTask
didReceiveData:(NSData *)data
{
//data 是接收到的响应体数据
}
//3.一次任务执行完成
- (void)URLSession:(NSURLSession *)session
task:(NSURLSessionTask *)task
didCompleteWithError:(NSError *)error
{
NSLog(@"网络请求完成");
}
- (void)URLSession:(NSURLSession *)session
task:(NSURLSessionTask *)task
didCompleteWithError:(NSError *)error
{
NSLog(@"网络请求完成");
}
三使用第三方框架AFNetworking(包括5个部分:NSURLConnection,NSURLSession,Reachability(网络检测:就是wifi或者流量或者没网),Security,Serialization(序列化,用来设置request和response序列化方式)),将第三方框架导入后,再引入#import “AFNetworking.h"
1.GET请求
//1.URL String
NSString *urlStr = @"http://news-at.zhihu.com/api/3/news/latest";
//2.AFHTTPSessionManager 管理网络请求
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
//3.序列化对象,RequestSerializatin有两种方式JSON 拼接
//(1)序列化请求的数据
// JSON 拼接
/*
AFHTTPRequestSerializer :&拼接格式
AFJSONRequestSerializer : JSON数据格式
*/
manager.requestSerializer = [AFHTTPRequestSerializer serializer];
//(2)解析响应数据
//AFURLResponseSerialization
//AFJSONResponseSerializer JSON
//AFXMLParserResponseSerializer XML
//AFPropertyListResponseSerializer plist
//AFImageResponseSerializer 图片
//AFCompoundResponseSerializer 组合数据
//把返回响应数据解析为JSON格式的数据
//如果不设置解析的对象,默认不会解析数据
manager.responseSerializer = [AFJSONResponseSerializer serializerWithReadingOptions:NSJSONReadingMutableContainers];
// manager.responseSerializer = [AFXMLParserResponseSerializer serializer];
//4.发GET请求
/**
* 发GET请求
*
* @param GET 接口的地址
* @param parameters 请求头或者其他参数
* @param success 请求成功的回调
* @param failure 请求失败的回调
*
*/
[manager GET:urlStr
parameters:nil
success:^(NSURLSessionDataTask *task, id responseObject) {
//responseObject 收到的响应数据
NSLog(@"response : %@", responseObject);
NSDictionary *data = responseObject;
NSString * str = [data objectForKey:@"date"];
NSLog(@"%@", str);
}
failure:^(NSURLSessionDataTask *task, NSError *error) {
NSLog(@"error %@", error);
}];
NSString *urlStr = @"http://news-at.zhihu.com/api/3/news/latest";
//2.AFHTTPSessionManager 管理网络请求
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
//3.序列化对象,RequestSerializatin有两种方式JSON 拼接
//(1)序列化请求的数据
// JSON 拼接
/*
AFHTTPRequestSerializer :&拼接格式
AFJSONRequestSerializer : JSON数据格式
*/
manager.requestSerializer = [AFHTTPRequestSerializer serializer];
//(2)解析响应数据
//AFURLResponseSerialization
//AFJSONResponseSerializer JSON
//AFXMLParserResponseSerializer XML
//AFPropertyListResponseSerializer plist
//AFImageResponseSerializer 图片
//AFCompoundResponseSerializer 组合数据
//把返回响应数据解析为JSON格式的数据
//如果不设置解析的对象,默认不会解析数据
manager.responseSerializer = [AFJSONResponseSerializer serializerWithReadingOptions:NSJSONReadingMutableContainers];
// manager.responseSerializer = [AFXMLParserResponseSerializer serializer];
//4.发GET请求
/**
* 发GET请求
*
* @param GET 接口的地址
* @param parameters 请求头或者其他参数
* @param success 请求成功的回调
* @param failure 请求失败的回调
*
*/
[manager GET:urlStr
parameters:nil
success:^(NSURLSessionDataTask *task, id responseObject) {
//responseObject 收到的响应数据
NSLog(@"response : %@", responseObject);
NSDictionary *data = responseObject;
NSString * str = [data objectForKey:@"date"];
NSLog(@"%@", str);
}
failure:^(NSURLSessionDataTask *task, NSError *error) {
NSLog(@"error %@", error);
}];
2.POST请求
//1.url string
NSString *urlStr = @"https://api.weibo.com/2/statuses/upload.json";
NSDictionary *params = @{
@"access_token": @"2.00TpCOFGgvN4eB4c8f6ca3cdBurugD",
@"status" : @"AF发条微博"
};
//拼接参数到URL后面
//https://api.weibo.com/2/statuses/update.json access_token=2.00TpCOFGgvN4eB4c8f6ca3cdBurugD&status=AF发条微博
//2.manager
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
//3.序列化
//(1)请求
manager.requestSerializer = [AFHTTPRequestSerializer serializer];
//(2)响应
manager.responseSerializer = [AFJSONResponseSerializer serializerWithReadingOptions:NSJSONReadingMutableContainers];
//4.发送请求
/*
[manager POST:<#(NSString *)#>
parameters:<#(id)#>
success:<#^(NSURLSessionDataTask *task, id responseObject)success#>
failure:<#^(NSURLSessionDataTask *task, NSError *error)failure#>];
*/
[manager POST:urlStr
parameters:params
constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
//构造请求体
//formData 要上传的数据,需要添加的数据追加在formData的后面
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"pic.JPG" ofType:nil];
NSData *data = [NSData dataWithContentsOfFile:filePath];
//data: 要添加的数据
//name: 数据对应的key
//filename: 服务器可以接受的文件名
//mimeType: 文件的类型
[formData appendPartWithFileData:data
name:@"pic"
fileName:@"file"
mimeType:@"image/jpeg"];
}
success:^(NSURLSessionDataTask *task, id responseObject) {
NSLog(@"response : %@", responseObject);
}
failure:^(NSURLSessionDataTask *task, NSError *error) {
NSLog(@"error : %@", error);
}];
NSString *urlStr = @"https://api.weibo.com/2/statuses/upload.json";
NSDictionary *params = @{
@"access_token": @"2.00TpCOFGgvN4eB4c8f6ca3cdBurugD",
@"status" : @"AF发条微博"
};
//拼接参数到URL后面
//https://api.weibo.com/2/statuses/update.json access_token=2.00TpCOFGgvN4eB4c8f6ca3cdBurugD&status=AF发条微博
//2.manager
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
//3.序列化
//(1)请求
manager.requestSerializer = [AFHTTPRequestSerializer serializer];
//(2)响应
manager.responseSerializer = [AFJSONResponseSerializer serializerWithReadingOptions:NSJSONReadingMutableContainers];
//4.发送请求
/*
[manager POST:<#(NSString *)#>
parameters:<#(id)#>
success:<#^(NSURLSessionDataTask *task, id responseObject)success#>
failure:<#^(NSURLSessionDataTask *task, NSError *error)failure#>];
*/
[manager POST:urlStr
parameters:params
constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
//构造请求体
//formData 要上传的数据,需要添加的数据追加在formData的后面
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"pic.JPG" ofType:nil];
NSData *data = [NSData dataWithContentsOfFile:filePath];
//data: 要添加的数据
//name: 数据对应的key
//filename: 服务器可以接受的文件名
//mimeType: 文件的类型
[formData appendPartWithFileData:data
name:@"pic"
fileName:@"file"
mimeType:@"image/jpeg"];
}
success:^(NSURLSessionDataTask *task, id responseObject) {
NSLog(@"response : %@", responseObject);
}
failure:^(NSURLSessionDataTask *task, NSError *error) {
NSLog(@"error : %@", error);
}];
3.download下载
//1.url string
NSString *urlStr = @"http://bcs.duapp.com/chenwei520/media/music.mp3";
//创建request
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:urlStr]];
//2.manager
//默认的管理对象, 不支持后台下载
//AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
//后台下载,后台下载需要将配置对象设置成backgroundSessionConfigurationWithIdentifier后台模式
NSURLSessionConfiguration *config = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:@"com.wxhl.AFNetworking"];
AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc] initWithSessionConfiguration:config];
//3.序列化
//....
//progress 表示进度的对象的指针
NSProgress *progress = nil;
//4.创建task任务
//request : 下载的请求
//progress: 下载的进度
//destination: 下载的文件的保存位置
//completionHandler: 下载完成的回调
NSURLSessionDownloadTask *task = [manager downloadTaskWithRequest:request
progress:&progress
destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) {
//指定下载的文件的保存位置
//返回值 NSURL 文件最后保存的位置
NSString *filePath = [NSHomeDirectory() stringByAppendingString:@"/Documents/music.mp3"];
NSURL *targetUrl = [NSURL fileURLWithPath:filePath];
NSLog(@"filePath : %@", filePath);
return targetUrl;
}
completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) {
NSLog(@"%@", response);
}];
//5.发送请求
[task resume];
NSString *urlStr = @"http://bcs.duapp.com/chenwei520/media/music.mp3";
//创建request
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:urlStr]];
//2.manager
//默认的管理对象, 不支持后台下载
//AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
//后台下载,后台下载需要将配置对象设置成backgroundSessionConfigurationWithIdentifier后台模式
NSURLSessionConfiguration *config = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:@"com.wxhl.AFNetworking"];
AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc] initWithSessionConfiguration:config];
//3.序列化
//....
//progress 表示进度的对象的指针
NSProgress *progress = nil;
//4.创建task任务
//request : 下载的请求
//progress: 下载的进度
//destination: 下载的文件的保存位置
//completionHandler: 下载完成的回调
NSURLSessionDownloadTask *task = [manager downloadTaskWithRequest:request
progress:&progress
destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) {
//指定下载的文件的保存位置
//返回值 NSURL 文件最后保存的位置
NSString *filePath = [NSHomeDirectory() stringByAppendingString:@"/Documents/music.mp3"];
NSURL *targetUrl = [NSURL fileURLWithPath:filePath];
NSLog(@"filePath : %@", filePath);
return targetUrl;
}
completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) {
NSLog(@"%@", response);
}];
//5.发送请求
[task resume];
0 0
- 网络编程(使用第三方框架和不使用第三方框架)
- 第三方框架AFN使用
- 第三方框架Cocoapod使用
- 第三方框架FMDB使用
- 第三方框架的使用
- 网络:XML 解析(使用GDataXMLNode第三方框架)
- OkHttp(第三方框架)的使用
- 不使用第三方分享框架实现分享功能
- 对第三方框架AFNetworking网络请求的使用浅析
- 使用ImageLoader第三方框架,加载网络图片
- IOS网络开发:AFNetworking第三方框架的使用
- 第三方okhttp网络访问框架使用教程
- 使用第三方框架Glide显示网络图片
- 网络通信第三方框架
- 第三方UIImageView框架SDWebImage的使用
- 第三方框架SDWebImage的使用
- 第三方框架ZipArchive的使用
- 使用Cocoapod导入第三方框架
- Spring入门1---Spring+junit配置
- jQuery-再叙when方法
- 永久更新google hosts的一些站点
- 第三人视角,摄像机跟随代码
- 学习笔记:Objective C 的内存管理(1)----引用计数器
- 网络编程(使用第三方框架和不使用第三方框架)
- 【leetcode】Find Peak Element
- Android Launcher分析和修改1——Launcher默认界面配置(default_workspace)
- Single Number II
- NSSArray和NSSet遍历哪个更快
- intellij idea14 无法自动编译
- iOS开发之二维码的生成
- 系统下载基地
- Overriding && Overloading