在移動互聯網時代,幾乎所有應用都需要用到網絡,比如QQ、微博、網易新聞、優酷、百度地圖,只有通過網絡跟外界進行數據交互、數據更新,應用才能保持新鮮、活力,如果沒有了網絡,也就缺少了數據變化,無論外觀多么華麗,終將變成一潭死水。下面我們嘗試一下如何進行網絡請求
http編程其實就是http請求。http請求最長用的方法是 get 和 post 方法。
1>get方法和post方法相比理解起來比較簡單,get方法可以直接請求一個url,也可以url后面拼接上參數作為一個新的url地址進行請求。get方法后面的value要經過unicode編碼。form的enctype屬性默認為application/x-www-form-urlencoded。不能發送二進制文件。
2>post方法相對要復雜一些。首先post方法要設置key和value ,所有的key和value都會拼接成 key1=value1&key2=value2的樣式的字符串,然后這個字符串轉化為二進制放到 http請求的body中。當請求發送的時候,也就跟隨body一起傳給服務器。http請求Content-Type設置為:application/x-www-form-urlencoded。這里講的只是簡單的post請求,一般發送文件不會選擇這種方式(從技術方面考慮也可以發送文件,就是把文件以 key 和 value的方式放入)。下面我們再討論一下post發送二進制文件更加普遍的方法
1、發送請求
- (void)viewDidLoad { //創建一個鏈接,別切拼接需要傳遞的參數,由于服務器為本地搭建,接受兩個參數一個是用戶名,一個是用戶密碼,因此我這里傳遞兩個參數過去,默認的是Get方式 NSURL * url=[NSURL URLWithString:@"http://192.168.0.111/logo.php?userName=jereh&pwd=123"]; //根據練級e NSMutableURLRequest * request=[NSMutableURLRequest requestWithURL:url]; //鏈接網絡并發送請求 [NSURLConnection connectionWithRequest:request delegate:self]; }
2、接受返回的數據
網絡請求后我們需要接受返回的數據,這里我們需要實現代理方法來接受返回數據,這里我們需要實現協議,并定義一個可變的NSData對象
以下幾個代理方法是經常用到的
#PRagma mark - NSURLConnectionDataDelegate#pragma mark 剛接收到服務器響應的時候調用- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{ self.data=[NSMutableData data]; NSLog(@"開始響應");}#pragma mark 開始接收服務器傳遞數據的時候調用,由于當傳遞的數據很大的時候,系統會分多次接受,因此我們需要定義一個可變的二進制對象來保存每次請求的數據- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{ NSLog(@"開始接收數據"); [self.data appendData:data];}#pragma mark 結束接收服務器數據的時候調用- (void)connectionDidFinishLoading:(NSURLConnection *)connection{ NSString * str=[[NSString alloc] initWithData:self.data encoding:NSUTF8StringEncoding]; NSLog(@"%@",str);}#pragma mark 接受數據出錯的時候調用- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{ NSLog(@"請求出錯");}
3、POST方法請求
上面我們采用的get方法,如果我們采用POST方法如何請求呢,只需要將不可變的請求變為可變的請求然后設置方法即可
- (void)viewDidLoad { //創建一個請求 NSURL * url=[NSURL URLWithString:@"http://192.168.0.111/logo.php?userName=jereh&pwd=123"]; NSMutableURLRequest * request=[NSMutableURLRequest requestWithURL:url]; //設置方法 request.HTTPMethod=@"POST"; //設置參數 NSString * param=@"userName=jereh&&pwd=123"; NSData * data=[param dataUsingEncoding:NSUTF8StringEncoding]; //設置請求體 request.HTTPBody=data; //鏈接網絡并發送請求 [NSURLConnection connectionWithRequest:request delegate:self]; }
4 同步方式發送請求
另外我們才發送請求的時候也可以采用同步方式的方式,如果我們在網絡請求的時候需要等待網絡請求結束在執行某個操作,我們可以采取同步請求
NSData * data= [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
5 block形式異步請求
另外在發送異步請求的時候,我們也可以采取block的形式,如下
NSOperationQueue * queue=[NSOperationQueue mainQueue]; [NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { NSString * str=[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];}];
新聞熱點
疑難解答