網絡數據請求(同步/異步連接下的GET/POST請求)

一.同步連接下的GET請求:

//第一步:創建網址對象
    NSURL * url = [NSURL URLWithString:@"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx?date=20131129&startRecord=1&len=5&udid=1234567890&terminalType=Iphone&cid=213"];
    //第二步:創建網絡請求對象
    NSURLRequest * request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:60.0];
    //第三步:創建連接對象,發送請求
    NSURLResponse * response = nil;
    NSError * error = nil;
    //返回的是NSData類型的數據
    NSData * data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
    //解析JSON數據第一種方式
    NSMutableDictionary * dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
    NSLog(@"%@",dic);
    NSLog(@"123");
    NSString * string = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
    
    //解析JSON數據第二種方式:(使用第三方JSONKit)
    NSDictionary *dic = [data objectFromJSONData];
    //將字典轉換成NSString形式
    NSString * string = [dic JSONString];
    NSLog(@"%@",string);
    self.dataTextView.text = string;

二.異步連接下的GET請求:(異步連接,必須通過協議方式處理請求過來的數據,所以需要遵守兩個協議:<NSURLConnectionDelegate,NSURLConnectionDataDelegate>)

//第一步:創建網址對象
    NSURL * url = [NSURL URLWithString:BaseUrl];
    //第二步:創建網絡請求對象
    NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:60.0];
    //第三步:創建異步連接,併發送請求
    self.connection =[NSURLConnection connectionWithRequest:request delegate:self];//聲明個屬性,因爲下面的協議方法中需要取消連接(手動)

實現代理方法:

//1.將要發送請求
-(NSURLRequest *)connection:(NSURLConnection *)connection willSendRequest:(NSURLRequest *)request redirectResponse:(NSURLResponse *)response
{
    NSLog(@"request = %@",request);
    return request;
}
//2.服務器已經響應
-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
    //獲取文件總長度
    _value = response.expectedContentLength;
    //給_recieveData開闢空間
    _recieveData = [[NSMutableData alloc]init];
    
    NSLog(@"response = %@",response);
}
//3.已經開始接收數據
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    //進行拼接
    [_recieveData appendData:data];//必須是可變的data
    NSLog(@"%ld",[_recieveData length]);//輸出拼接後長度
    //將每次拼接得到的數據除以總數據的大小
    self.progressVIew.progress = 1.0*[_recieveData length]/_value;//注意需要乘以1.0
    
    NSLog(@"data = %@",data);
}
//4.數據傳輸(發送/接收)結束
-(void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    NSLog(@"*******%@",connection);
    [connection cancel];
}
//5.傳輸數據失敗
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
    NSLog(@"失敗原因:%@",error);
}

三.同步下的POST請求:(使用了第三方JSONKit)

//1.創建網址對象
    NSURL *url = [NSURL URLWithString:BASE_URL_2];
    //2.創建請求對象(創建可變的,因爲後面要設置request中的屬性值)
    NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:60.0];
    //3.設置請求方式(如果沒設置,默認是GET請求)
    [request setHTTPMethod:@"POST"];
    
#warning mark------NSString與NSData類型之間的轉換非常非常重要,必須要掌握
    
#pragma mark-----NSString轉換爲NSData
    NSData * data = [BASE_URL_2_PARAM dataUsingEncoding:NSUTF8StringEncoding];
#pragma mark-----NSData轉換成NSString
//    NSString *string = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
    
    //4.設置請求體
    [request setHTTPBody:data];
    //5.創建連接對象,併發送請求
    NSData * data1 = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
    //解析數據
    NSMutableDictionary * dic = [NSJSONSerialization JSONObjectWithData:data1 options:NSJSONReadingMutableContainers error:nil];
    
    NSString * string = [dic JSONString];
    self.dataTextView.text = string;

四.異步連接下的POST請求:(同樣需要遵守上面提到的兩個協議:<NSURLConnectionDelegate,NSURLConnectionDataDelegate>)

//1.創建網址對象
    NSURL *url = [NSURL URLWithString:BASE_URL_2];
    //2.請求對象
    NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:60.0];
    //①.設置請求方式
    [request setHTTPMethod:@"POST"];
    //②.設置請求體
    NSData *data = [BASE_URL_2_PARAM dataUsingEncoding:NSUTF8StringEncoding];
    [request setHTTPBody:data];
    //3.創建異步連接對象,併發送請求
#pragma mark ------第一種方式:(通過協議的方式,處理請求數據)
//    [NSURLConnection connectionWithRequest:request delegate:self];
#pragma mark ------第二種方式:(block方式)
    //調取系統隊列
    NSOperationQueue * mainQueue = [NSOperationQueue mainQueue];
    //防止內存泄露
    __block SecondViewController *secondVC = self;
    [NSURLConnection sendAsynchronousRequest:request queue:mainQueue completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
        //此方法中data是獲得的最後的data,相對於協議方法,協議可以獲得每一步中的data
        NSMutableDictionary *dic = [data objectFromJSONData];
        secondVC.dataTextView.text = [dic JSONString];
    }];

實現協議方法:

//1.將要發送請求
-(NSURLRequest *)connection:(NSURLConnection *)connection willSendRequest:(NSURLRequest *)request redirectResponse:(NSURLResponse *)response
{
    return request;
}
//2.服務器已經響應
-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
    
    //開闢空間
    _recieveData = [[NSMutableData alloc]init];
}
//3.已經開始接收數據
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    //對每次傳來的數據進行拼接
    [_recieveData appendData:data];
    
    
}
//4.接收數據完畢
-(void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    //解析最後拼接完成的完整數據
    NSMutableDictionary * dic = [_recieveData objectFromJSONData];
    self.dataTextView.text = [dic JSONString];
}
//5.傳輸過程中出現錯誤:(斷網,自動關機,斷電....),發生錯誤時執行
-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
    NSLog(@"error = %@",error);
}



發佈了19 篇原創文章 · 獲贊 9 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章