ios原生態網絡請求

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

1、get:?1234567891011121314

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:?123456789101112131415161718192021

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:?123456NSString * 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就可以了。一般用到四個委托方法:?12345678910111213141516171819202122232425262728293031

//接受到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進行判斷。了解不同情況的請求失敗,可以更好的給用戶提示。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容