網絡請求

網絡請求需要服務器地址即URL也叫接口:統一資源定位符, (形式:http: 超文本傳輸協議)

NSURL(將網址轉換爲NSURL對象)  創建NSURL對象
創建網絡請求 NSURLRequest NSMutableURLRequest
將字符串轉爲NSData對象       NSData *parmData = [parmStr dataUsingEncoding:NSUTF8StringEncoding];
設置請求體(網絡請求對象調用) setHTTPBody:;設置請求方式(網絡請求對象調用) setHTTPMethod:
NSURLConnection

一,網絡請求有兩種方式:(兩種方式的目的都是傳遞參數)
1,GET請求 :  (URL (服務器地址) + ? + 參數(參數都是key=value格式的))

2,POST請求

3,GET請求與POST請求的區別:
    1.GET請求的接口會包含參數部分,參數會作爲網址的一部分.服務器地址與參數之間通過 ? 來間隔.POST請求會將服務器地址與參數分開,請求接口中只有服務器地址,而參數會作爲請求體的一部分,提交給後臺服務器.    2.GET請求,參數會出現在接口中,不安全,POST請求相對安全.    3.雖然GET請求與POST請求可以用來請求與提交數據,但是一般情況GET多用於從後臺請求數據,POST多用於向後臺提交數據.

二,兩種請求過程
1,創建GET請求
(1),將網址初始化成OC字符串對象
如: 
NSString *urlString = [NSString stringWithFormat:@"%@?query=%@&region=%@&output=json&ak=6E823f587c95f0148c19993539b99295", kBusinessInfoURL,@"銀行", @"濟南"];

如果網址中存在中文,進行URLEncode轉換
    NSString *newURLString = [urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

(2),構建網絡URL對象,NSURL(將網址轉換爲NSURL對象)
NSURL *url = [NSURL URLWithString:newURLString];

(3),創建網絡請求
NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:10];


2,創建POST請求
post請求需要創建參數字符串對象並將字符串對象轉爲NSData對象,設置請求體和請求方式,對於GET請求不能設置請求方式,但可以查看請求方式
(1),將網址初始化成OC字符串對象
NSString *urlString = [NSString stringWithFormat:@"%@" @"http://api.tudou.com/v3/gw"];
如果網址中存在中文,進行URLEncode轉換

(2),構建網絡URL對象,NSURL(將網址轉換爲NSURL對象)
NSURL *url = [NSURL URLWithString:urlString];

(3),創建網絡請求(由於POST請求接收的數據是一段一段的需要拼接,因襲請求對象是可變的)
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:10];
(4),創建參數字符串對象,
    NSString *parmStr = [NSString stringWithFormat:@"method=album.channel.get&appKey=myKey&format=json&channel=t&pageNo=1&pageSize=10"];
(5),將字符串轉爲NSData對象    NSData *parmData = [parmStr dataUsingEncoding:NSUTF8StringEncoding];(6),設置請求體    [request setHTTPBody:parmData];(7),設置請求方式    [request setHTTPMethod:@"POST"];三,網絡連接

網絡鏈接分爲兩種:異步鏈接和同步鏈接
同步和異步的區別:
(1),同步連接:主線程去請求數據,當數據未請求完畢之前,其他操作一律不響應.會造成程序的假死現象.(2),異步連接:會單獨開一個線程去處理網絡請求,主線程依然處理用戶交互.程序運行流暢
我們常用的是異步鏈接

1,GET請求的鏈接

(1),同步鏈接

 NSURLResponse *response = nilNSError *error = nil;
 NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];

(2),異步鏈接需要服從議NSURLConnectionDataDelegate
該協議又服從NSURLConnectionDelegate協議

 [NSURLConnection connectionWithRequest:request delegate:self];


2,POST請求的鏈接

(1),同步鏈接

NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];

(2),異步鏈接,需要服從議NSURLConnectionDataDelegate
該協議又服從NSURLConnectionDelegate協議
[NSURLConnection connectionWithRequest:request delegate:self];


NSURLConnectionDataDelegate方法:
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {    length = [response expectedContentLength];    NSLog(@"%lld", length);    //當收到服務器響應時,data開闢空間,接下來服務器要返回數據    self.data = [NSMutableData data]; }
//當收到服務器返回的數據時觸發,返回的可能是資源片段. - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {    //拼接數據    [self.data appendData:data];    CGFloat rate = self.data.length * 1.0 / length;    NSLog(@"%.2f", rate); }
//當服務器返回所有數據時觸發,數據返回完畢 - (void)connectionDidFinishLoading:(NSURLConnection *)connection { //    self.data;//就是服務器返回的所有的數據    //解析    NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:self.data options:NSJSONReadingMutableContainers error:nil];    NSLog(@"%@", dic); }


NSURLConnectionDelegate協議方法 - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {    NSLog(@"error"); } - (void)viewDidLoad


四,請求完數據需對數據進行解析

XML解析兩種解析原理:    SAX解析:是一種基於事件回調的解析機制,就是使用協議以及代理.SAX解析是逐行解析,讀入數據時只讀入一行,一行一行的解析,所以SAX解析佔用內存較小,適合於大數據解析    DOM解析:一次性將內容全部讀入內存,將內容讀成樹形結構,逐層解析,適合小數據解析
JSON解析
對於JSONKit提供的解析方式,是爲NSString,NSData添加分類的方式,在分類中添加了解析的方法.效率僅次於系統的.    JSON格式數據解析成NSArray,NSDictionary.而爲NSArray,NSDictionary添加的分類的方法,則是將OC的對象,轉化爲JSON格式的字符串


















發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章