一、http與https協議
URL全稱是uniform Resource Locator(統一資源定位符)。
基本格式爲:協議://主機地址/路徑
https協議比http協議多了一個加密步驟。
關於網絡請求的返回錯誤,常見的一些網絡錯誤:
404:服務器找不到指定的資源,請求的頁面不存在(例如,瀏覽器請求的網頁已被刪除或轉移,但不排除鏈接有效的可能性); 410:所請求的頁面不存在(注:410代表一個永久的,暫時的,404); 200:服務器成功返回請求的頁面; 301永久重定向的URL 302:你用的是360瀏覽器一般而言,瀏覽器只支持http請求裏的GET請求。
二、http請求方式(iOS中)
常見的請求有GET請求和POST請求。
不同點:
1.給服務器傳輸數據的方式不同:
GET:通過網址字符串
POST:通過data
2.傳輸數據的大小
GET:網址字符串最多255字節(目前可以達到1kb)
POST:使用NSData
3.安全性
GET:所有傳輸給服務器的數據,顯示在網址裏,類似於密碼的明文輸入,直接可見。
POST:數據被轉化爲NSData(二進制數據),類似於密碼的密文輸入。
三、編程實現網絡請求
首先,在Xcode的info.plist文件裏需要修改信息,使其支持http請求。
上demo:
//get的同步請求
-(void)getAndSychronous{
//第一步,得到服務器地址(統一資源定位符)
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 alloc]initWithURL:url];
//創建同步鏈接
NSError* error;
//在這裏運用的是廢棄的方法
NSData *data = [NSURLConnection sendSynchronousRequest:req returningResponse:nil error:&error];
//解析傳回的json數據
NSDictionary* dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];
NSLog(@"%@",dic);
}
//get異步請求
-(void)getAndAsychronous{
//第一步,得到服務器地址(統一資源定位符)
NSString *URLStr = @"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx?date=20151031&startRecord=1&len=1&udid=1234567890&terminalType=Iphone&cid=213";
//網址
NSURL *url = [NSURL URLWithString:URLStr];
//創建網絡請求
NSURLRequest *req = [[NSURLRequest alloc]initWithURL:url];
//異步請求block
[NSURLConnection sendAsynchronousRequest:req queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
NSDictionary* dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:&connectionError];
NSLog(@"%@",dic);
}];
NSLog(@"異步請求---------*");
}
//Post同步請求
-(void)postAndsychronous{
//post請求,一般只需要,協議:主機地址:路徑
NSString* URLStr = @"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx";
//創建路徑
NSURL* url = [NSURL URLWithString:URLStr];
//設置請求方式
NSMutableURLRequest* mReq = [[NSMutableURLRequest alloc]initWithURL:url];
//不設置的時候默認爲get請求
[mReq setHTTPMethod:@"POST"];
//設置參數
NSString* pStr = @"date=20151031&startRecord=1&len=1&udid=1234567890&terminalType=Iphone&cid=213";
NSData* pData = [pStr dataUsingEncoding:NSUTF8StringEncoding];
//爲請求設置參數
[mReq setHTTPBody:pData];
//建立同步鏈接
NSData *data = [NSURLConnection sendSynchronousRequest:mReq returningResponse:nil error:nil];
NSDictionary* dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];
NSLog(@"%@",dic);
}
//post異步 協議代理
-(void)postAndAsychronous{
//建立路徑
NSString* pStr = @"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx";
NSURL *url = [NSURL URLWithString:pStr];
//初始化請求
NSMutableURLRequest* mReq = [[NSMutableURLRequest alloc]initWithURL:url];
//設置請求參數
NSString* str =@"date=20151031&startRecord=1&len=5&udid=1234567890&terminalType=Iphone&cid=213";
NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding];
[mReq setHTTPMethod:@"POST"];
[mReq setHTTPBody:data];
//開始異步請求
NSURLConnection *connection = [NSURLConnection connectionWithRequest:mReq delegate:self];
}
#pragma mark <NSURLConnectionDelegate,NSURLConnectionDataDelegate>
//開始響應
-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{
NSLog(@"開始響應,可以初始化容器");
//將要開始返回數據
self.mData = [[NSMutableData alloc]init];
}
//接受數據,data只是數據片段,需要我們進行拼接
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{
NSLog(@"開始接受數據片段");
[self.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);
}
//session的get請求
- (void)sessionGet{
//獲取全局對象
NSURLSession* session = [NSURLSession sharedSession];
/*//設置工作模式的方法
NSURLSessionConfiguration* confi = [NSURLSessionConfiguration defaultSessionConfiguration];
NSURLSession *sessionSet = [NSURLSession sessionWithConfiguration:confi];*/
//創建URL對象
NSURL *url = [NSURL URLWithString:@"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx?date=20151031&startRecord=1&len=5&udid=1234567890&terminalType=Iphone&cid=213"];
//不需要設置請求超時打開
/*//建立請求任務
NSURLSessionDataTask *task = [session dataTaskWithURL:url completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:&error];
NSLog(@"在block裏解析的數據------%@",dic);
}];
//啓動請求任務
[task resume];*/
//需要設置請求超時,第二個參數爲緩存策略
NSURLRequest* req = [[NSURLRequest alloc]initWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:30];
//建立任務
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==%@",str);
}];
[task resume];
}
//session的post請求
-(void)sessionPost{
//設置網址
//post請求,一般只需要,協議:主機地址:路徑
NSString* URLStr = @"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx";
//創建路徑
NSURL* url = [NSURL URLWithString:URLStr];
//設置請求對象,只要設置請求方式,就必須是可變的請求對象
NSMutableURLRequest* req = [[NSMutableURLRequest alloc]initWithURL:url];
//設置請求方式,不設置的話,默認爲GET方式
[req setHTTPMethod:@"POST"];
//設置參數
NSString* pStr = @"date=20151031&startRecord=1&len=1&udid=1234567890&terminalType=Iphone&cid=213";
NSData* pData = [pStr dataUsingEncoding:NSUTF8StringEncoding];
//爲請求設置參數,注意參數類型,需要的是NSData類型
[req setHTTPBody:pData];
//得到全局的session對象
NSURLSession *session = [NSURLSession sharedSession];
//設置加載任務的對象
NSURLSessionDataTask* 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];
}
//session的post代理請求
-(void)sessionPostDelegate{
//設置網址
NSURL *url = [NSURL URLWithString:@"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx"];
//建立請求對象
NSMutableURLRequest* mReq = [[NSMutableURLRequest alloc]initWithURL:url];
//設置請求對象的請求超時
[mReq setTimeoutInterval:30];
//設置請求對象的請求方法
[mReq setHTTPMethod:@"POST"];
//設置請求對象的請求參數
NSString* str = @"date=20151031&startRecord=1&len=10&udid=1234567890&terminalType=Iphone&cid=213";
NSData* data = [str dataUsingEncoding:NSUTF8StringEncoding];
[mReq setHTTPBody:data];
//建立全局對象,用以創建請求任務
NSURLSessionConfiguration* config = [NSURLSessionConfiguration defaultSessionConfiguration];
NSURLSession *session = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:[[NSOperationQueue alloc]init]];
NSURLSessionTask* task = [session dataTaskWithRequest:mReq];
[task resume];
}
#pragma mark <NSURLSessionDataDelegate>
-(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler{
NSLog(@"服務器開始響應,準備返回數據");
//允許處理服務器對象,纔會進行下一步操作
completionHandler(NSURLSessionResponseAllow);
//當網絡請求爲http時,response的實質是NSHTTPURLResponse類型
NSHTTPURLResponse *HTTPResponse = (NSHTTPURLResponse *)response;
//創建可變的data,準備接收請求的字符片段。
self.mData = [NSMutableData data];
}
-(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data{
NSLog(@"服務器開始返回數據");
//開始接收每次收到的data數據
[self.mData appendData:data];
}
-(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error{
NSLog(@"數據接收完成,網絡請求成功");
//轉化接收回來的數據
if (!error) {
NSString *str = [[NSString alloc]initWithData:self.mData encoding:NSUTF8StringEncoding];
NSLog(@"我是請求回來的數據%@",str);
}else{
NSLog(@"%@",error);
}
}