|
今天來說說關(guān)于iOS開發(fā)過程中的網(wǎng)絡(luò)請(qǐng)求。 關(guān)于網(wǎng)絡(luò)請(qǐng)求的重要性我想不用多說了吧。對(duì)于移動(dòng)客戶端來說,網(wǎng)絡(luò)的重要性不言而喻。常見的網(wǎng)絡(luò)請(qǐng)求有同步GET, 同步POST, 異步GET, 異步POST。今天來看一下四種網(wǎng)絡(luò)請(qǐng)求的實(shí)現(xiàn)方式。 一、同步GET // 1.將網(wǎng)址初始化成一個(gè)OC字符串對(duì)象 NSString *urlStr = [NSString stringWithFormat:@"%@?query=%@?ion=%@&output=json&ak=6E823f587c95f0148c19993539b99295", kBusinessInfoURL, @"銀行", @"濟(jì)南"]; // 如果網(wǎng)址中存在中文,進(jìn)行URLEncode NSString *newUrlStr = [urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; // 2.構(gòu)建網(wǎng)絡(luò)URL對(duì)象, NSURL NSURL *url = [NSURL URLWithString:newUrlStr]; // 3.創(chuàng)建網(wǎng)絡(luò)請(qǐng)求 NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:10]; // 創(chuàng)建同步鏈接 NSURLResponse *response = nil; NSError *error = nil; NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; 當(dāng)創(chuàng)建好同步鏈接以后, 就可以采用相應(yīng)的方法進(jìn)行解析。下面創(chuàng)建異步連接也是一樣的。 二、同步POST // 1.根據(jù)網(wǎng)址初始化OC字符串對(duì)象 NSString *urlStr = [NSString stringWithFormat:@"%@", kVideoURL]; // 2.創(chuàng)建NSURL對(duì)象 NSURL *url = [NSURL URLWithString:urlStr]; // 3.創(chuàng)建請(qǐng)求 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; // 4.創(chuàng)建參數(shù)字符串對(duì)象 NSString *parmStr = @"method=album.channel.get&appKey=myKey&format=json&channel=t&pageNo=1&pageSize=10"; // 5.將字符串轉(zhuǎn)為NSData對(duì)象 NSData *pramData = [parmStr dataUsingEncoding:NSUTF8StringEncoding]; // 6.設(shè)置請(qǐng)求體 [request setHTTPBody:pramData]; // 7.設(shè)置請(qǐng)求方式 [request setHTTPMethod:@"POST"]; // 創(chuàng)建同步鏈接 NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; 三、異步GET NSString *urlStr = [NSString stringWithFormat:@"http://image.zcool.com.cn/56/13/1308200901454.jpg"];
NSString *newStr = [urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSURL *url = [NSURL URLWithString:newStr];
NSURLRequest *requst = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:10];
//異步鏈接(形式1,較少用)
[NSURLConnection sendAsynchronousRequest:requst queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
self.imageView.image = [UIImage imageWithData:data];
// 解析
NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
NSLog(@"%@", dic);
}];四、異步POST // POST請(qǐng)求 NSString *urlString = [NSString stringWithFormat:@"%@",kVideoURL]; //創(chuàng)建url對(duì)象 NSURL *url = [NSURL URLWithString:urlString]; //創(chuàng)建請(qǐng)求 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:10]; //創(chuàng)建參數(shù)字符串對(duì)象 NSString *parmStr = [NSString stringWithFormat:@"method=album.channel.get&appKey=myKey&format=json&channel=t&pageNo=1&pageSize=10"]; //將字符串轉(zhuǎn)換為NSData對(duì)象 NSData *data = [parmStr dataUsingEncoding:NSUTF8StringEncoding]; [request setHTTPBody:data]; [request setHTTPMethod:@"POST"]; //創(chuàng)建異步連接(形式二) [NSURLConnection connectionWithRequest:request delegate:self]; 一般的,當(dāng)創(chuàng)建異步連接時(shí), 很少用到第一種方式,經(jīng)常使用的是代理方法。關(guān)于NSURLConnectionDataDelegate,我們經(jīng)常使用的協(xié)議方法為一下幾個(gè): // 服務(wù)器接收到請(qǐng)求時(shí)
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
}
// 當(dāng)收到服務(wù)器返回的數(shù)據(jù)時(shí)觸發(fā), 返回的可能是資源片段
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
}
// 當(dāng)服務(wù)器返回所有數(shù)據(jù)時(shí)觸發(fā), 數(shù)據(jù)返回完畢
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
}
// 請(qǐng)求數(shù)據(jù)失敗時(shí)觸發(fā)
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
NSLog(@"%s", __FUNCTION__);
}最后,分析一下這幾種呢網(wǎng)絡(luò)請(qǐng)求的區(qū)別。 GET請(qǐng)求和POST請(qǐng)求的區(qū)別: 1. GET請(qǐng)求的接口會(huì)包含參數(shù)部分,參數(shù)會(huì)作為網(wǎng)址的一部分,服務(wù)器地址與參數(shù)之間通過 ? 來間隔。POST請(qǐng)求會(huì)將服務(wù)器地址與參數(shù)分開,請(qǐng)求接口中只有服務(wù)器地址,而參數(shù)會(huì)作為請(qǐng)求的一部分,提交后臺(tái)服務(wù)器。 2. GET請(qǐng)求參數(shù)會(huì)出現(xiàn)在接口中,不安全。而POST請(qǐng)求相對(duì)安全。 3.雖然GET請(qǐng)求和POST請(qǐng)求都可以用來請(qǐng)求和提交數(shù)據(jù),但是一般的GET多用于從后臺(tái)請(qǐng)求數(shù)據(jù),POST多用于向后臺(tái)提交數(shù)據(jù)。 同步和異步的區(qū)別: 同步鏈接:主線程去請(qǐng)求數(shù)據(jù),當(dāng)數(shù)據(jù)請(qǐng)求完畢之前,其他線程一律不響應(yīng),會(huì)造成程序就假死現(xiàn)象。 異步鏈接:會(huì)單獨(dú)開一個(gè)線程去處理網(wǎng)絡(luò)請(qǐng)求,主線程依然處于可交互狀態(tài),程序運(yùn)行流暢。 |
|
|