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 ];