一 . 說(shuō)明:
iOS9.0之后 , 蘋(píng)果推出了NSURLSession來(lái)取代NSURLConnection , 所以今天寫(xiě)一篇文章總結(jié)一下所學(xué) . 總結(jié)前有兩點(diǎn)說(shuō)明 :
1 ) 今天主要是針對(duì)NSURLSession . 將不對(duì)NSURLConnection做任何講解 .
2 ) 工程已經(jīng)配置好了http請(qǐng)求相關(guān) .
二 . GET請(qǐng)求
GET請(qǐng)求共有兩種創(chuàng)建方法 , 針對(duì)Request的和針對(duì)URL的 .
//針對(duì)Request的
-(void)requestGet
{
//GET請(qǐng)求涮阔,直接把請(qǐng)求參數(shù)跟在URL的后面以?隔開(kāi) , 多個(gè)參數(shù)之間以&符號(hào)拼接
舉例:http://www.dronghui.com/drhxx?m=xxx&b=xxxx&n=xxx
//1.確定請(qǐng)求路徑
NSURL *url = [NSURL URLWithString:@"http://www.dronghui.com"];
//2.創(chuàng)建請(qǐng)求對(duì)象
//請(qǐng)求對(duì)象內(nèi)部默認(rèn)已經(jīng)包含了請(qǐng)求頭和請(qǐng)求方法(GET)
NSURLRequest *request = [NSURLRequest requestWithURL:url];
//3.獲得會(huì)話對(duì)象
NSURLSession *session = [NSURLSession sharedSession];
//4.根據(jù)會(huì)話對(duì)象創(chuàng)建一個(gè)Task ( 發(fā)送請(qǐng)求 )
/*
第一個(gè)參數(shù) : 請(qǐng)求對(duì)象
第二個(gè)參數(shù) : completionHandler回調(diào) ( 請(qǐng)求完成 ["成功"or"失敗"] 的回調(diào) )
data : 響應(yīng)體信息(期望的數(shù)據(jù))
response : 響應(yīng)頭信息,主要是對(duì)服務(wù)器端的描述
error : 錯(cuò)誤信息 , 如果請(qǐng)求失敗 , 則error有值
*/
NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
if (error == nil) {
//6.解析服務(wù)器返回的數(shù)據(jù)
//說(shuō)明:(此處返回的數(shù)據(jù)是JSON格式的沐序,因此使用NSJSONSerialization進(jìn)行反序列化處理)
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil];
NSLog(@"%@",dict);
}
}];
//5.執(zhí)行任務(wù)
[dataTask resume];
}
//針對(duì)URL的
-(void)urlGet
{
//1.確定請(qǐng)求路徑
NSURL *url = [NSURL URLWithString:@"http://www.dronghui.com"];
//2.獲得會(huì)話對(duì)象
NSURLSession *session = [NSURLSession sharedSession];
//3.根據(jù)會(huì)話對(duì)象創(chuàng)建一個(gè)Task(發(fā)送請(qǐng)求)
/*
第一個(gè)參數(shù):請(qǐng)求路徑
第二個(gè)參數(shù):completionHandler回調(diào) ( 請(qǐng)求完成["成功"or"失敗"]的回調(diào) )
data:響應(yīng)體信息 ( 期望的數(shù)據(jù) )
response:響應(yīng)頭
error:錯(cuò)誤信息 , 請(qǐng)求失敗 , error有值
注意:
1)該方法內(nèi)部會(huì)自動(dòng)將請(qǐng)求路徑包裝成一個(gè)請(qǐng)求對(duì)象 , 該請(qǐng)求對(duì)象默認(rèn)包含了請(qǐng)求頭信息和請(qǐng)求方法 ( GET )
2)如果要發(fā)送的是POST請(qǐng)求 , 則不能使用該方法
*/
NSURLSessionDataTask *dataTask = [session dataTaskWithURL:url completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
//5.解析數(shù)據(jù)
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil];
NSLog(@"%@",dict);
}];
//4.執(zhí)行任務(wù)
[dataTask resume];
}
三 . POST請(qǐng)求
基本與get一致 , request.HTTPMethod = @"POST"
-(void)post
{
//1.創(chuàng)建會(huì)話對(duì)象
NSURLSession *session = [NSURLSession sharedSession];
//2.根據(jù)會(huì)話對(duì)象創(chuàng)建task
NSURL *url = [NSURL URLWithString:@"http://image.baidu.com/search/detail"];
//3.創(chuàng)建可變的請(qǐng)求對(duì)象
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
//4.修改請(qǐng)求方法為POST
request.HTTPMethod = @"POST";
//5.設(shè)置請(qǐng)求體
request.HTTPBody = [@"ct=503316480&z=0&ipn=false&word=劉亦菲&hs=0&pn=-1&spn=0&di=baikeimg&pi=&rn=1&tn=baiduimagedetail&is=&istype=&ie=utf-8&oe=utf-8&in=&cl=2&lm=-1&st=&ln=undefined&fr=ala&fmq=undefined&fm=undefined&ic=&s=&se=&sme=&tab=&width=&height=&face=&cg=star&bdtype=0&oriquery=&objurl=http%3A%2F%2Fimgsrc.baidu.com%2Fbaike%2Fpic%2Fitem%2Fe4dde71190ef76c604622df99816fdfaae5167b4.jpg&fromurl=http%3A%2F%2Fbaike.baidu.com%2Fsubview%2F3064%2F13233367.htm&gsm=" dataUsingEncoding:NSUTF8StringEncoding];
//6.根據(jù)會(huì)話對(duì)象創(chuàng)建一個(gè)Task(發(fā)送請(qǐng)求)
/*
第一個(gè)參數(shù):請(qǐng)求對(duì)象
第二個(gè)參數(shù):completionHandler回調(diào)(請(qǐng)求完成【成功|失敗】的回調(diào))
data:響應(yīng)體信息(期望的數(shù)據(jù))
response:響應(yīng)頭信息迅细,主要是對(duì)服務(wù)器端的描述
error:錯(cuò)誤信息,如果請(qǐng)求失敗碍侦,則error有值
*/
NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
//8.解析數(shù)據(jù)
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil];
NSLog(@"%@",dict);
}];
//7.執(zhí)行任務(wù)
[dataTask resume];
}
四 . 代理相關(guān)
#import "ViewController.h"
@interface ViewController ()<NSURLSessionDataDelegate>
@property (nonatomic, strong) NSMutableData *responseData;
@end
@implementation ViewController
-(NSMutableData *)responseData
{
if (_responseData == nil) {
_responseData = [NSMutableData data];
}
return _responseData;
}
//當(dāng)點(diǎn)擊控制器View的時(shí)候會(huì)調(diào)用該方法
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
[self delegateTest];
}
//發(fā)送請(qǐng)求,代理方法
-(void)delegateTest
{
//1.確定請(qǐng)求路徑
NSURL *url = [NSURL URLWithString:@"http://www.baidu.com"];
//2.創(chuàng)建請(qǐng)求對(duì)象
//請(qǐng)求對(duì)象內(nèi)部默認(rèn)已經(jīng)包含了請(qǐng)求頭和請(qǐng)求方法(GET)
NSURLRequest *request = [NSURLRequest requestWithURL:url];
//3.獲得會(huì)話對(duì)象,并設(shè)置代理
/*
第一個(gè)參數(shù):會(huì)話對(duì)象的配置信息defaultSessionConfiguration 表示默認(rèn)配置
第二個(gè)參數(shù):誰(shuí)成為代理,此處為控制器本身即self
第三個(gè)參數(shù):隊(duì)列往堡,該隊(duì)列決定代理方法在哪個(gè)線程中調(diào)用械荷,可以傳主隊(duì)列|非主隊(duì)列
[NSOperationQueue mainQueue] 主隊(duì)列: 代理方法在主線程中調(diào)用
[[NSOperationQueue alloc]init] 非主隊(duì)列: 代理方法在子線程中調(diào)用
*/
NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[NSOperationQueue mainQueue]];
//4.根據(jù)會(huì)話對(duì)象創(chuàng)建一個(gè)Task(發(fā)送請(qǐng)求)
NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request];
//5.執(zhí)行任務(wù)
[dataTask resume];
}
//1.接收到服務(wù)器響應(yīng)的時(shí)候調(diào)用該方法
-(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler
{
//在該方法中可以得到響應(yīng)頭信息,即response
NSLog(@"didReceiveResponse--%@",[NSThread currentThread]);
//注意:需要使用completionHandler回調(diào)告訴系統(tǒng)應(yīng)該如何處理服務(wù)器返回的數(shù)據(jù)
//默認(rèn)是取消的
/*
NSURLSessionResponseCancel = 0, 默認(rèn)的處理方式虑灰,取消
NSURLSessionResponseAllow = 1, 接收服務(wù)器返回的數(shù)據(jù)
NSURLSessionResponseBecomeDownload = 2,變成一個(gè)下載請(qǐng)求
NSURLSessionResponseBecomeStream 變成一個(gè)流
*/
completionHandler(NSURLSessionResponseAllow);
}
//2.接收到服務(wù)器返回?cái)?shù)據(jù)的時(shí)候會(huì)調(diào)用該方法吨瞎,如果數(shù)據(jù)較大那么該方法可能會(huì)調(diào)用多次
-(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data
{
NSLog(@"didReceiveData--%@",[NSThread currentThread]);
//拼接服務(wù)器返回的數(shù)據(jù)
[self.responseData appendData:data];
}
//3.當(dāng)請(qǐng)求完成(成功|失敗)的時(shí)候會(huì)調(diào)用該方法 , 如果請(qǐng)求失敗 , 則error有值
-(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error
{
NSLog(@"didCompleteWithError--%@",[NSThread currentThread]);
if(error == nil)
{
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:self.responseData options:kNilOptions error:nil];
NSLog(@"%@",dict);
}
}
@end