今天來說說關(guān)于iOS開發(fā)過程中的網(wǎng)絡數(shù)據(jù)請求鹃祖。
現(xiàn)在常用的網(wǎng)絡數(shù)據(jù)請求常見的有四種方式:同步GET恬口,同步POST,異步GET歉秫,異步POST端考。
一揭厚,同步GET
//1.將網(wǎng)址初始化成一個OC字符串對象
NSString *urlString = [NSString stringWithFormat:@"%@query=%@&ion=%@output=json&ak=6E823f587c95f0148c19993539b99295", kBusinessInfoURL, @"銀行"扶供, @"濟南"];
//如果網(wǎng)址中存在中文,進行URLEncode.
NSString *newUrlStr = [urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
//2.構(gòu)建網(wǎng)絡URL對象,NSURL
NSURL *url = [NSURL URLWithString:newUrlStr];
//3.創(chuàng)建網(wǎng)絡請求
NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:10];
//創(chuàng)建同步連接
NSURLResponse *response = nil;
NSError *error = nil;
NSData *data = [NSURLConnection sendSynchronousRequest:request reurningResponse:&response error:&error];
當創(chuàng)建好同步連接以后太援,就可以采用響應的方法進行解析提岔。下面創(chuàng)建異步鏈接也是一樣的
二笋敞,同步POST
//1.根據(jù)網(wǎng)址初始化OC字符串對象
NSString *urlStr = [NSString stringWithFormat:@"%@",kVideoURL];
//2.創(chuàng)建NSURL對象
NSURL *url = [NSURL URLWithString:urlStr];
//3.創(chuàng)建請求
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
//4,創(chuàng)建參數(shù)字符串對象
NSString *parmStr = @"method=album.channel.get&appKey=myKey&format=json&channel=t&pageNo=1&pageSize=10";
//5.將字符串轉(zhuǎn)成NSData對象
NSString *parmData = [parmStr dataUsingEncoding:NSUTF8StringEncoding];
//6.設置請求體
[request setHTTPBody:pramData];
//7.設置請求體
[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 *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutIntercal;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請求
NSString *urlString = [NSString stringWithFormat:@"%@",kVideoURL];
//創(chuàng)建url對象
NSURL *url = [NSURL URLWithString:urlString];
//創(chuàng)建請求
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:10];
//創(chuàng)建參數(shù)字符串對象
NSString *parmStr = [NSString stringWithFormat:@"method=album.channel.get&appKey=myKey&format=json&channel=t&pageNo=1&pageSize=10"];
//將字符串轉(zhuǎn)換為NSData對象
NSData *data = [parmStr dataUsingEncoding:NSUTF8StringEncoding];
[request setHTTPBody:data];
[request setHTTPMethod:@"POST"];
//創(chuàng)建異步連接(形式二)
[NSURLConnection connectionWithRequest:request delegate:self];
一般的喷兼,當創(chuàng)建異步連接時后雷,很少用到第一種方式季惯,經(jīng)常使用的是代理方法。關(guān)于NSURLConnectionDataDelegate,我們進場使用的協(xié)議方法為一下幾個:
// 服務器接收到請求時
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
}
// 當收到服務器返回的數(shù)據(jù)時觸發(fā), 返回的可能是資源片段
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
}
// 當服務器返回所有數(shù)據(jù)時觸發(fā), 數(shù)據(jù)返回完畢
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
}
// 請求數(shù)據(jù)失敗時觸發(fā)
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
NSLog(@"%s", __FUNCTION__);
}
最后走孽,分析一下這幾種呢網(wǎng)絡請求的區(qū)別磕瓷。
GET請求和POST請求的區(qū)別:
GET請求的接口會包含參數(shù)部分困食,參數(shù)會作為網(wǎng)址的一部分,服務器地址與參數(shù)之間通過 ? 來間隔硕盹。POST請求會將服務器地址與參數(shù)分開叨咖,請求接口中只有服務器地址甸各,而參數(shù)會作為請求的一部分,提交后臺服務器趣倾。
GET請求參數(shù)會出現(xiàn)在接口中,不安全善绎。而POST請求相對安全诫尽。
3.雖然GET請求和POST請求都可以用來請求和提交數(shù)據(jù),但是一般的GET多用于從后臺請求數(shù)據(jù)剂跟,POST多用于向后臺提交數(shù)據(jù)驹止。
同步和異步的區(qū)別:
同步鏈接:主線程去請求數(shù)據(jù),當數(shù)據(jù)請求完畢之前衣洁,其他線程一律不響應坊夫,會造成程序就假死現(xiàn)象砖第。
異步鏈接:會單獨開一個線程去處理網(wǎng)絡請求梧兼,主線程依然處于可交互狀態(tài),程序運行流暢羽杰。