UI進階——數據請求

一、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);
    }
    
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章