一、網絡請求的基本知識
1.get方法與post方法
- get是從服務器上獲取數據,post是向服務器傳送數據。
- get是把參數數據隊列加到提交表單的ACTION屬性所指的URL中,值和表單內各個字段一一對應, 在URL中可以看到。post是通過HTTP post機制,將表單內各個字段與其內容放置在HTML HEADER內一起 傳送到ACTION屬性所指的URL地址。用戶看不到這個過程。
- 對于get方式,服務器端用Request.QueryString獲取變量的值,對于post方式,服務器端用Request. Form獲取提交的數據。
4.get是明文傳輸,post是轉為NSData
還是不明白,回頭再看這篇原創文章講了些post和get的問題,觀點有些不同http://www.nowamagic.net/librarys/veda/detail/1919這是400、500、301、200等網站狀態碼的含義
http://www.maolvge.cn/news/jianzhanchangshi/29.html2.
2.同步和異步
同步:提交請求->等待服務器處理->處理完畢返回
這個期間客戶端瀏覽器不能干任何事
異步: 請求通過事件觸發->服務器處理(這是瀏覽器仍然可以作其他事情)->處理完畢session自己內部封裝了線程,不存在同步請求的問題了
3.NSURLConnection和NSURLConnection
iOS7以前,使用的都是NSURLConnection在WWDC2013中,推出了NSURLSession作為替代。下面這篇文章比較清楚地講了NSURLConnection和NSURLSession的一些區別和內容URLSession是一種任務模式iOS 7系列譯文:忘記NSURLConnection,擁抱NSURLSession吧!
4.設置Info.plist文件
添加一條App Transport Secutity Settings把其下的Allow Arbitrary Loads 屬性改為YES二、使用NSURLConnection
1.get方法
//get的同步請求
-(void)getAndSynchronize
{
NSString *urlStr = @"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx?date=20151031&startRecord=1&len=5&udid=1234567890&terminalType=Iphone&cid=213";
//得到網址
NSURL *url = [NSURL URLWithString:urlStr];
//創建請求
NSURLRequest *req = [NSURLRequest requestWithURL:url];
//創建同步鏈接
NSData *data = [NSURLConnection sendSynchronousRequest:req returningResponse:nil error:nil];
//json解析
NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];
NSLog(@"11%@",dic);
}
//get的異步請求,使用block方法
-(void)getAndAsynchronize
{
NSString *urlStr = @"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx?date=20151031&startRecord=1&len=5&udid=1234567890&terminalType=Iphone&cid=213";
//得到網址
NSURL *url = [NSURL URLWithString:urlStr];
//創建請求
NSURLRequest *req = [NSURLRequest requestWithURL:url];
__block NSDictionary *dic = [NSDictionary dictionary];
//創建異步
[NSURLConnection sendAsynchronousRequest:req queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];
NSLog(@"%@",dic);
}];
NSLog(@"異步鏈接下面");
}
2.post方法同步請求
//post同步請求
-(void)postAndSynchronize
{
//post請求,一般只包含 協議://host/路徑
NSString *urlStr = @"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx";
//得到網址
NSURL *url = [NSURL URLWithString:urlStr];
//請求方式為post,所有要創建為NSMutableURLRequest
NSMutableURLRequest *mReq = [[NSMutableURLRequest alloc]initWithURL:url];
//設置情感方式,不設置時,默認為GET請求
[mReq setHTTPMethod:@"POST"];
//創建參數
NSString *pStr = @"date=20151031&startRecord=1&len=5&udid=1234567890&terminalType=Iphone&cid=213";
NSData *pData = [pStr dataUsingEncoding:NSUTF8StringEncoding];
//設置參數
[mReq setHTTPBody:pData];
//建立同步鏈接
NSData *resultData = [NSURLConnection sendSynchronousRequest:mReq returningResponse:nil error:nil];
NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:resultData options:NSJSONReadingAllowFragments error:nil];
NSLog(@"%@",dic);
}
post方法,使用block和代理方式
//POST異步請求
-(void)postAndAsynchronize
{
NSString *str = @"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx";
NSURL *url = [NSURL URLWithString:str];
NSMutableURLRequest *mReq = [NSMutableURLRequest requestWithURL:url];
//cahce策略,超時time
NSMutableURLRequest *mReq1 = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:30];
[mReq setHTTPMethod:@"POST"];
//設置參數
NSString *pStr = @"date=20151031&startRecord=1&len=5&udid=1234567890&terminalType=Iphone&cid=213";
NSData *pData = [pStr dataUsingEncoding:NSUTF8StringEncoding];
[mReq setHTTPBody:pData];
//1.block
__block NSDictionary *dic = [NSDictionary dictionary];
//建立異步鏈接
[NSURLConnection sendAsynchronousRequest:mReq queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];
// NSLog(@"%@",dic);
}];
//2.使用協議代理方法
NSURLConnection *conn = [NSURLConnection connectionWithRequest:mReq delegate:self];
}
#pragma mark -- connect的異步代理方法
//開始
-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
NSLog(@"開始相應,可以在此代理方法中初始化容器");
_mData = [[NSMutableData alloc]init];
}
//接收數據,data只是數據片段,不是完整數據,需要拼接
-(void)connection:(NSURLConnection *)connection didReceiveData:(nonnull NSData *)data
{
NSLog(@"開始返回數據片段");
[_mData appendData:data];
}
//本次鏈接完成
-(void)connectionDidFinishLoading:(NSURLConnection *)connection
{
NSLog(@"鏈接完成");
//可以在此解析數據
NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:self.mData options:NSJSONReadingAllowFragments error:nil];
NSLog(@"%@",dic);
}
//鏈接出錯
-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
NSLog(@"error - %@",error);
}
三、使用NSURLSession
1.在WWDC2013中,推出了NSURLSession作為替代。
支持后臺運行的網絡任務暫停、停止、重啟網絡任務、不再需要NSOpation封裝請求可以使用同樣的配置容器不同的session可以使用不同的私有存儲,block和代理可以同時起作用直接從文件系統上傳下載為了方便程序員使用,蘋果提供了一個全局session所有的任務(Task)都是由Session發起的所有的任務默認是掛起的,
需要ResumeNSURLSession的三種工作模式
默認會話模式(default)
瞬間會話模式(ephemeral)
不會有任何緩存后臺會話模式(background)
在后臺進行網絡請求,在沒有session以前使用gcd可以讓應用程序在進入后臺時繼續運行0分鐘支持三種任務加載瞬間,下載,上傳,父類都是NSURLSessionTaskNSURLSessionDataTaskNSURLSessionUploadTaskNSURLSessionDownloadTask1.session get block的方法
//session get block
-(void)sessionGet
{
//第一種方式創建session,單例,獲取全局session對象
NSURLSession *session = [NSURLSession sharedSession];
//第二種方式創建session,可以給session設置工作模式
// NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
// NSURLSession *session = [NSURLSession sessionWithConfiguration:config];
//創建url對象
NSString *urlStr = @"http://ipad-bjwb.bjd.com.cn/DigitalPublication/
publish/Handler/APINewsList.ashx?date=20151031&startRecord=1&len=5&udid=1234567890&terminalType=Iphone&cid=213";
//得到網址
NSURL *url = [NSURL URLWithString:urlStr];
// //建立請求任務.block方式,通過url建立task,不需要建立request
// NSURLSessionDataTask *task = [session dataTaskWithURL:url
completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error)
{
//
// //解析數據
//
// }];
//如果需要設置緩存策略、請求超時等,需要創建請求對象request
NSURLRequest *req = [[NSURLRequest alloc]initWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy
timeoutInterval:30];
//通過request方式建立任務
NSURLSessionTask *task = [session dataTaskWithRequest:req
completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error)
{
NSString *str = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"%@",str);
}];
//啟動任務
[task resume];
}
2.session get 代理方法
導入NSURLSessionDelegate,NSURLSessionDataDelegate協議
//session post delegate
-(void)sessionDelegate
{
//創建url對象
NSString *urlStr = @"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx";
//得到網址
NSURL *url = [NSURL URLWithString:urlStr];
//創建參數
NSString *pStr = @"date=20151031&startRecord=1&len=5&udid=1234567890&terminalType=Iphone&cid=213";
NSData *pData = [pStr dataUsingEncoding:NSUTF8StringEncoding];
NSMutableURLRequest *mReq = [[NSMutableURLRequest alloc]initWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:30];
//設置請求超時
[mReq setTimeoutInterval:30];
[mReq setCachePolicy:NSURLRequestReloadIgnoringCacheData];
[mReq setHTTPMethod:@"POST"];
[mReq setHTTPBody:pData];
//代理的方法,主線程
NSURLSession *session_1 = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[NSOperationQueue mainQueue]];
//創建任務(因為要使用代理方法,就不需要block方法初始化)
NSURLSessionDataTask *task_1 = [session_1 dataTaskWithRequest:mReq];
//啟動
[task_1 resume];
}
#pragma mark -- session delegate
//服務器開始響應,準備返回數據
-(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler
{
//運行出來服務器的響應
completionHandler(NSURLSessionResponseAllow);
//當網絡請求是基于http協議的時候,response的本質為NSHTTPURLResponse
// NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse*)response;
//初始化容器
_mData = [NSMutableData data];
}
//客戶端接收數據
-(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data
{
[_mData appendData:data];
}
//數據請求完成網絡請求成功,當error不為空,說明響應出錯
-(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error
{
if (error) {
NSLog(@"error -- %@",error);
}
else
{
NSString *str = [[NSString alloc]initWithData:_mData encoding:NSUTF8StringEncoding];
NSLog(@"delegate -- %@",str);
}
}
3.session post方法 block
-(void)sessionPost
{
//創建url對象
NSString *urlStr = @"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx";
//得到網址
NSURL *url = [NSURL URLWithString:urlStr];
//創建參數
NSString *pStr = @"date=20151031&startRecord=1&len=5&udid=1234567890&terminalType=Iphone&cid=213";
NSData *pData = [pStr dataUsingEncoding:NSUTF8StringEncoding];
//創建request
NSMutableURLRequest *mReq = [[NSMutableURLRequest alloc]initWithURL:url
cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:30];
//設置
[mReq setHTTPMethod:@"POST"];
[mReq setHTTPBody:pData];
//建session
NSURLSession *session = [NSURLSession sharedSession];
//加載任務的數據對象
NSURLSessionTask *task = [session dataTaskWithRequest:mReqcompletionHandler:^
(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error)
{
NSString *str = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"%@",str); }];
//開啟任務
[task resume];
}
緩存策略NSURLRequestCachePolicy
1> NSURLRequestUseProtocolCachePolicy = 0, 默認的緩存策略,如果緩存不存在,直接從服務端獲取。如果緩存存在,會根據response中的Cache-Control字段判斷下一步操作,如:Cache-Control字段為must-revalidata,則詢問服務端該數據是否有更新,無更新的話直接返回給用戶緩存數據,若已更新,則請求服務端.
2> NSURLRequestReloadIgnoringLocalCacheData = 1,忽略本地緩存數據,直接請求服務端.
3> NSURLRequestIgnoringLocalAndRemoteCacheData = 4,忽略本地緩存,代理服務器以及其他中介,直接請求源服務端.
4> NSURLRequestReloadIgnoringCacheData =NSURLRequestReloadIgnoringLocalCacheData
5> NSURLRequestReturnCacheDataElseLoad= 2, 有緩存就使用,不管其有效性(即忽略Cache-Control字段), 無則請求服務端.
6> NSURLRequestReturnCacheDataDontLoad =3, 死活加載本地緩存. 沒有就失敗.(確定當前無網絡時使用)
7>NSURLRequestReloadRevalidatingCacheData =5, 緩存數據必須得得到服務端確認有效才使用(貌似是NSURLRequestUseProtocolCachePolicy中的一種情況)Tips: URL Loading System默認只支持如下5中協議: 其中只有http://和https://才有緩存策略./(1) http://(2) https://(3) ftp://(4) file://(5) data://