一、HTTP協議的常見請求方式
無論是哪種請求方式都應該在info.plist文件中設置網絡權限
權限設置.png
首先是GET請求
//get請求
-(void)getMethod{
//創建會話對象,用來建立客戶端和服務端的會話(通信)
//session一共有三種會話模式:默認,瞬時,后臺
NSURLSession* session=[NSURLSession sharedSession];
//網址
NSURL* url=[NSURL URLWithString:@"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx?date=20151101&startRecord=1&len=5&udid=1234567890&terminalType=Iphone&cid=213"];
//建立任務對象 任務類為NSURLSessionDataTask,他有三個子類:NSURLSessionDataTask(加載任務)、NSURLSessionUpLoadTask(上傳任務)、NSURLSessionDownLoadTask(下載任務),根據不同的需求使用對應的任務對象
//直接使用url,沒有設置請求方式,默認為get請求
NSURLSessionDataTask* task=[session dataTaskWithURL:url completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
//data:請求返回的數據
//response:響應對象,里面包含了少量數據和響應頭
//error:響應出問題時返回的錯誤日志
//根據返回的數據結構進行對應的解析
if (data) {
NSDictionary* dic=[NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];
// NSLog(@"%@",[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
NSLog(@"%@",dic);
}else{
NSLog(@"未請求到數據");
}
} ];
//啟動任務
[task resume];
}
下面是第二種GET請求的方式
//第二種get請求
-(void)newGetMethod{
//創建會話模式對象
//默認:向后臺請求數據的時候,如果數據沒有發生變化,就從本地緩存進行加載,如果沒有變化,重新從服務器獲取數據,如果本地沒有緩存,直接從服務器獲取
// NSURLSessionConfiguration* configuration=[NSURLSessionConfiguration defaultSessionConfiguration];
//瞬時:本地不會做任何緩存,每次請求都是從服務器獲取新數據
NSURLSessionConfiguration* ephemeralConfiguration=[NSURLSessionConfiguration ephemeralSessionConfiguration];
//后臺:如果有些網絡請求需要在客戶端后臺進行操作,那么就需要使用該種會話模式,使用時需要加一個標記,方便查找和操作
// NSURLSessionConfiguration* backgroundConfiguration=[NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:@"background"];
//創建會話對象 設置一下會話模式
NSURLSession* session=[NSURLSession sessionWithConfiguration:ephemeralConfiguration];
//創建網址
NSURL* url=[NSURL URLWithString:@"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx?date=20151101&startRecord=1&len=5&udid=1234567890&terminalType=Iphone&cid=213"];
//創建請求對象 可變的requset對象可以設置請求方式(默認的請求方式為GET),還可以設置請求體(轉換成data類型的參數)
NSURLRequest* request=[NSURLRequest requestWithURL:url];
//創建任務對象
NSURLSessionDataTask* task=[session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
if (data) {
NSDictionary* dic=[NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];
// NSLog(@"%@",[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
NSLog(@"%@",dic);
}else{
NSLog(@"未請求到數據");
}
}];
//啟動任務
[task resume];
}
還可以使用協議代理,首先遵循協議
NSURLSessionDelegate,NSURLSessionDataDelegate
-(void)delegate{
NSURLSession* session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[[NSOperationQueue alloc]init]];
//創建任務
NSURLSessionDataTask* task = [session dataTaskWithRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx?date=20151101&startRecord=5&len=10&udid=1234567890&terminalType=Iphone&cid=213"]]];
//啟動任務
[task resume];
}
協議方法
//代理方法
//服務器開始響應 準備返回數據
-(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler{
NSLog(@"服務器開始響應");
//允許處理服務器的響應,才會繼續接收服務器返回的數據
completionHandler(NSURLSessionResponseAllow);
}
-(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data{
NSLog(@"客戶端接收數據");
NSLog(@"dic---%@",[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]);
}
-(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error{
NSLog(@"數據接收完成,網絡請求成功");
}
POST請求
//post請求
-(void)postMethod{
//session對象
NSURLSession* session=[NSURLSession sharedSession];
//網址
NSURL* url=[NSURL URLWithString:@"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx"];
//?date=20151101&startRecord=1&len=5&udid=1234567890&terminalType=Iphone&cid=213
//如果我們使用的是post請求方式,就需要用到可變的mRequest對象
NSMutableURLRequest* mRequest=[NSMutableURLRequest requestWithURL:url];
//設置請求方式,默認為GET
mRequest.HTTPMethod=@"POST";
//設置請求體
NSString* postStr=@"date=20151101&startRecord=1&len=5&udid=1234567890&terminalType=Iphone&cid=213";
NSData* postData=[postStr dataUsingEncoding:NSUTF8StringEncoding];
mRequest.HTTPBody=postData;
//創建任務對象
NSURLSessionDataTask* task=[session dataTaskWithRequest:mRequest completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
if (data) {
NSDictionary* dic=[NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];
// NSLog(@"%@",[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
NSLog(@"%@",dic);
}else{
NSLog(@"未請求到數據");
}
}];
//啟動任務
[task resume];
}
兩種請求方式進行比較
不同點:
1.給服務器傳輸數據的方式不同
GET:通過網址字符串
POST:通過Data
2.傳輸數據的大小
GET:網址字符串最多為255字節
POST:使用NSData,容量超過1G
3.安全性
GET:所有傳輸給服務的數據,顯示在網址里,類似于密碼的明文輸入,直接可見
POST:數據被轉成NSData,類似于密碼的密文輸入,無法直接讀取
下載
//下載
-(void)downLoadMethod{
NSURLSession* session=[NSURLSession sharedSession];
NSURL* url=[NSURL URLWithString:@"http://e.hiphotos.baidu.com/image/pic/item/7af40ad162d9f2d3433e1c33acec8a136327cc3a.jpg"];
NSURLSessionDownloadTask* task=[session downloadTaskWithURL:url completionHandler:^(NSURL * _Nullable location, NSURLResponse * _Nullable response, NSError * _Nullable error) {
//location:下載完成的數據所在的地址,在tmp臨時文件中
//由于臨時文件夾中的文件一般在下載結束后,如果不使用,就會被干掉,所以我們會將下載好的文件移動到我們指定的位置保存
// /Users/xalo/Desktop/
NSString* dsiPath=@"/Users/xalo/Desktop/test.png";
//將文件路徑轉換為url類型
NSURL* urlPath=[NSURL fileURLWithPath:dsiPath];
NSFileManager* manager=[NSFileManager defaultManager];
//將文件拷貝到指定路徑下
BOOL isSuccess= [manager copyItemAtURL:location toURL:urlPath error:nil];
if (isSuccess) {
NSLog(@"文件下載成功");
}else{
NSLog(@"文件下載失敗");
}
}];
//啟動任務
[task resume];
}
以上方法都需要在ViewDidLoad中調用即可