iOS上的http請求:get、post以及同步、非同步

來源:互聯網
上載者:User

iOS上的http請求:get、post以及同步、非同步

網上有個公開的天氣介面:天氣 ,點進其中的getSupportCityDataset介面,用這個介面為例寫一下iOS上的HTTP請求的寫法。 這裡面提供了get、post請求的格式要求。

1、get:

NSString * URLString = @"http://webservice.webxml.com.cn/WebServices/WeatherWS.asmx/getSupportCityDataset?theRegionCode=廣東";    NSURL * URL = [NSURL URLWithString:[URLString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];        NSURLRequest * request = [[NSURLRequest alloc]initWithURL:URL];    NSURLResponse * response = nil;    NSError * error = nil;    NSData * data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];    if (error) {        NSLog(@"error: %@",[error localizedDescription]);    }else{        NSLog(@"response : %@",response);        NSLog(@"backData : %@",[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]);    }
get方法的請求參數是放在長長的URL字串裡面,這裡只需要一個參數,就是地區的編號或名字,通過這個參數,伺服器返回屬於這個地區內支援天氣尋找的城市列表。如果有更多的參數也是放在URL字串裡面,至於參數的組織方式,就看伺服器的要求了。

用字串構建NSURL,最好在使用URLWithString的時候把原字串進行一下UTF8轉碼,關於為何要轉碼,看下這裡第一部分。然後NSURL對象構建NSURLRequest,使用NSURLConnection的同步方法,傳入request對象就可以通過get方法擷取資料。

這裡有個NSError對象地址傳入,用於做錯誤判斷,網路的實際情況是多變的,必須要考慮請求錯誤的情況,否則可能導致程式奔潰。

2、post:

NSString * URLString = @"http://webservice.webxml.com.cn/WebServices/WeatherWS.asmx/getSupportCityString";    NSURL * URL = [NSURL URLWithString:[URLString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];        NSString * postString = @"theRegionCode=廣東";    NSData * postData = [postString dataUsingEncoding:NSUTF8StringEncoding];  //將請求參數字串轉成NSData類型        NSMutableURLRequest * request = [[NSMutableURLRequest alloc]init];    [request setHTTPMethod:@"post"]; //指定請求方式    [request setURL:URL]; //佈建要求的地址    [request setHTTPBody:postData];  //佈建要求的參數        NSURLResponse * response;    NSError * error;    NSData * backData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];        if (error) {        NSLog(@"error : %@",[error localizedDescription]);    }else{        NSLog(@"response : %@",response);        NSLog(@"backData : %@",[[NSString alloc]initWithData:backData encoding:NSUTF8StringEncoding]);    }
post方式的時候參數是放在HTTPBody裡面的,而且需要將字串轉碼成響應的NSData類型,在介面文檔裡一般都有指出轉碼方式,需要按指定方式轉碼,這裡的UTF8,也有gb2312的。request構建好了之後,和get方法一樣使用NSURLConnection請求資料。

3、同步和非同步請求:

一般網路請求都需要一段時間,哪怕資料再少、網路再好,都會有一段時間,而且很多時候必須考慮在網路不好的時候的app狀態。使用同步請求只需安心等待資料就可以,不需要做額外操作,上面兩例都是同步請求,connection調用方法後會把返回請求的資料,無需做什麼其他事。但是同步會阻塞線程,如果通過點擊button來發起請求,那麼按鈕會停留在highLight狀態直到請求結束,會造成一種app卡住、死機的感覺,很不好。

非同步get:

NSString * URLString = @"http://webservice.webxml.com.cn/WebServices/WeatherWS.asmx/getSupportCityDataset?theRegionCode=廣東";    NSURL * URL = [NSURL URLWithString:[URLString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];        NSURLRequest * request = [[NSURLRequest alloc]initWithURL:URL];        _connection = [[NSURLConnection alloc]initWithRequest:request delegate:self];  (1)
非同步post類似,不再是使用NSURLConnection調用方法直接得到資料,而是使用(1)位置方法構建一個NSURLConnection對象,這個方法會預設開始請求資料。接下來關鍵就是靠委託了。因為請求的時間未知,所以使用委託模式的回調作用,在資料回來是調用協議方法。post和get委託方法處理一樣。

協議方法:

要注意的是這裡有兩個委託:NSURLConnectionDataDelegate和NSURLConnectionDelegate,前一個繼承於後一個,擷取資料的方法是定義在前一個委託裡面的,所以只要遵循NSURLConnectionDataDelegate就可以了。

一般用到四個委託方法:

//接受到respone,這裡麵包含了HTTP請求狀態代碼和資料頭資訊,包括資料長度、編碼格式等-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{ NSLog(@"response = %@",response); _backData = [[NSMutableData alloc]init];}//接受到資料時調用,完整的資料可能拆分為多個包發送,每次接受到資料片段都會調用這個方法,所以需要一個全域的NSData對象,用來把每次的資料拼接在一起-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{    [_backData appendData:data];}//資料接受結束時調用這個方法,這時的資料就是獲得的完整資料了,可以使用資料做之後的處理了-(void)connectionDidFinishLoading:(NSURLConnection *)connection{    NSLog(@"%@",[[NSString alloc]initWithData:_backData encoding:NSUTF8StringEncoding]);}//這是請求出錯是調用,錯誤處理不可忽視-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{    if (error.code == NSURLErrorTimedOut) {        NSLog(@"請求逾時");    }    NSLog(@"%@",[error localizedDescription]);}

   最後,請求可以設定逾時時間:
NSURLRequest * request = [[NSURLRequest alloc]initWithURL:URL cachePolicy:0 timeoutInterval:8.0];
或者:
NSMutableURLRequest * request = [[NSMutableURLRequest alloc]initWithURL:URL]; [request setTimeoutInterval:8.0];
請求時間超過所設定的逾時時間,會自動調用
-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
但是有個問題是怎麼把判斷是逾時導致的請求失敗,上面的例子裡已經寫了,可以根據返回的error的code進行判斷。瞭解不同情況的請求失敗,可以更好的給使用者提示。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.