今天來講說關於iOS開發過程當中的網絡請求。json
關於網絡請求的重要性我想不用多說了吧。對於移動客戶端來講,網絡的重要性不言而喻。常見的網絡請求有同步GET, 同步POST, 異步GET, 異步POST。今天來看一下四種網絡請求的實現方式。安全
1、同步GET服務器
1
2
3
4
5
6
7
8
9
10
11
12
|
// 1.將網址初始化成一個OC字符串對象
NSString *urlStr = [NSString stringWithFormat:@
"%@?query=%@®ion=%@&output=json&ak=6E823f587c95f0148c19993539b99295"
, kBusinessInfoURL, @
"銀行"
, @
"濟南"
];
// 若是網址中存在中文,進行URLEncode
NSString *newUrlStr = [urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
// 2.構建網絡URL對象, NSURL
NSURL *url = [NSURL URLWithString:newUrlStr];
// 3.建立網絡請求
NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:10];
// 建立同步連接
NSURLResponse *response = nil;
NSError *error = nil;
NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
|
當建立好同步連接之後, 就能夠採用相應的方法進行解析。下面建立異步鏈接也是同樣的。微信
2、同步POST網絡
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
// 1.根據網址初始化OC字符串對象
NSString *urlStr = [NSString stringWithFormat:@
"%@"
, kVideoURL];
// 2.建立NSURL對象
NSURL *url = [NSURL URLWithString:urlStr];
// 3.建立請求
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
// 4.建立參數字符串對象
NSString *parmStr = @
"method=album.channel.get&appKey=myKey&format=json&channel=t&pageNo=1&pageSize=10"
;
// 5.將字符串轉爲NSData對象
NSData *pramData = [parmStr dataUsingEncoding:NSUTF8StringEncoding];
// 6.設置請求體
[request setHTTPBody:pramData];
// 7.設置請求方式
[request setHTTPMethod:@
"POST"
];
// 建立同步連接
NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
|
3、異步GETapp
1
2
3
4
5
6
7
8
9
10
11
|
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);
}];
|
4、異步POST異步
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
// POST請求
NSString *urlString = [NSString stringWithFormat:@
"%@"
,kVideoURL];
//建立url對象
NSURL *url = [NSURL URLWithString:urlString];
//建立請求
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:10];
//建立參數字符串對象
NSString *parmStr = [NSString stringWithFormat:@
"method=album.channel.get&appKey=myKey&format=json&channel=t&pageNo=1&pageSize=10"
];
//將字符串轉換爲NSData對象
NSData *data = [parmStr dataUsingEncoding:NSUTF8StringEncoding];
[request setHTTPBody:data];
[request setHTTPMethod:@
"POST"
];
//建立異步鏈接(形式二)
[NSURLConnection connectionWithRequest:request delegate:self];
|
通常的,當建立異步鏈接時, 不多用到第一種方式,常常使用的是代理方法。關於NSURLConnectionDataDelegate,咱們常常使用的協議方法爲一下幾個:ide
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
// 服務器接收到請求時
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
}
// 當收到服務器返回的數據時觸發, 返回的多是資源片斷
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
}
// 當服務器返回全部數據時觸發, 數據返回完畢
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
}
// 請求數據失敗時觸發
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
NSLog(@
"%s"
, __FUNCTION__);
}
|
最後,分析一下這幾種呢網絡請求的區別。url
GET請求和POST請求的區別:spa
1. GET請求的接口會包含參數部分,參數會做爲網址的一部分,服務器地址與參數之間經過 ? 來間隔。POST請求會將服務器地址與參數分開,請求接口中只有服務器地址,而參數會做爲請求的一部分,提交後臺服務器。
2. GET請求參數會出如今接口中,不安全。而POST請求相對安全。
3.雖然GET請求和POST請求均可以用來請求和提交數據,可是通常的GET多用於從後臺請求數據,POST多用於向後臺提交數據。
同步和異步的區別:
同步連接:主線程去請求數據,當數據請求完畢以前,其餘線程一概不響應,會形成程序就假死現象。
異步連接:會單獨開一個線程去處理網絡請求,主線程依然處於可交互狀態,程序運行流暢。