網絡處理2-異步POST請求和同步請求

1、異步POST請求

假如請求路徑是http://192.168.1.102:8080/MJServer/login,請求參數有2個:服務器

  • username :母雞
  • pwd :123

1.POST請求細節分析

要想在iOS中發送一個POST請求,首先要了解POST請求的一些細節:app

1> 跟GET請求不同的是,POST請求的請求參數不是拼接在請求路徑後面,而是以請求體的形式發送到服務器端。異步

2> POST請求須要發送兩部分的數據到服務器端:post

* 請求體內容:全部的請求參數編碼

username=%E6%AF%8D%E9%B8%A1&pwd=123

中文參數須要進行編碼,參數"母雞"被編碼成"%E6%AF%8D%E9%B8%A1"url

 

* 請求頭信息:請求體長度、請求數據的類型spa

(這是我在FireBug中模擬POST請求的截圖)code

Content-Length是指請求體長度,Content-Type是指請求數據類型orm

 

2.POST請求代碼實現

複製代碼
 1 // 請求地址
 2 NSString *urlString = @"http://192.168.1.102:8080/MJServer/login";
 3 // 初始化一個NSURL對象
 4 NSURL *url = [NSURL URLWithString:urlString];
 5 
 6 // 初始化一個請求
 7 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
 8 // 設置請求方法
 9 request.HTTPMethod = @"POST";
10 // 60秒請求超時
11 request.timeoutInterval = 60;
12 
13 // 拼接請求參數
14 NSString *params = @"username=母雞&pwd=123";
15 // 對字符串進行編碼後轉成NSData對象
16 NSData *data = [params dataUsingEncoding:NSUTF8StringEncoding];
17 // 設置請求體
18 request.HTTPBody = data;
19 
20 // 設置請求頭信息-請求體長度
21 NSString *contentLength = [NSString stringWithFormat:@"%i", data.length];
22 [request setValue:contentLength forHTTPHeaderField:@"Content-Length"];
23 // 設置請求頭信息-請求數據類型
24 [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
25 
26 // 初始化一個鏈接
27 NSURLConnection *conn = [NSURLConnection connectionWithRequest:request delegate:self];
28 // 開始一個異步請求
29 [conn start];
複製代碼

1> 在18行設置了請求體內容對象

2> 從第21~24行設置了請求頭信息

3> 其實,第21~24行代碼能夠省略。只要咱們在第18行設置了請求體,系統在發送POST請求時,會自動根據請求體內容加上相應的請求頭信息

 

2、NSURLConnection的其餘請求方法

除了start方法,NSURLConnection還提供了2個靜態方法幫助咱們發送HTTP請求

1.異步請求

複製代碼
 1 // 請求地址
 2 NSString *urlString = @"http://192.168.1.102:8080/MJServer/login?username=123&pwd=123";
 3 // 初始化一個NSURL對象
 4 NSURL *url = [NSURL URLWithString:urlString];
 5 
 6 // 初始化一個請求
 7 NSURLRequest *request = [NSURLRequest requestWithURL:url];
 8 
 9 // 初始化一個操做隊列
10 NSOperationQueue *queue = [[[NSOperationQueue alloc] init] autorelease];
11 // 發送一個異步請求
12 [NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:
13 ^(NSURLResponse *response, NSData *data, NSError *error) {
14     // 解析成字符串數據
15     NSString *str = [[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] autorelease];
16     NSLog(@"%@", str);
17 }];
複製代碼

在12行調用sendAsynchronousRequest:queue:completionHandler:方法發送一個異步HTTP請求,這個方法接收3個參數

* 第1個參數是一個NSURLRequest對象,封裝的是一個GET請求

* 第3個參數是一個Block,當服務器成功返回數據時會回調這個Block,Block中的NSData *data參數就是服務器返回的數據

* 第2個參數是一個操做隊列NSOperationQueue,當服務器成功返回數據時,系統會將第3個參數中傳入的Block放到這個操做隊列中執行

 

2.同步請求

前面說的都是異步請求,也是比較推薦的請求方式。NSURLConnection也提供了一個靜態方法能夠發送一個同步請求。

複製代碼
 1 // 請求地址
 2 NSString *urlString = @"http://192.168.1.102:8080/MJServer/login?username=123&pwd=123";
 3 // 初始化一個NSURL對象
 4 NSURL *url = [NSURL URLWithString:urlString];
 5 
 6 // 初始化一個請求
 7 NSURLRequest *request = [NSURLRequest requestWithURL:url];
 8 
 9 // 發送一個同步請求
10 NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
11 
12 // 解析成字符串數據
13 NSString *str = [[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] autorelease];
14 NSLog(@"%@", str);
複製代碼

在第10行調用了sendSynchronousRequest:returningResponse:error:方法發送了一個同步請求,這是一個阻塞式的方法,也就是等服務器返回全部數據後,這個方法纔會返回,返回值是一個NSData對象,存放着服務器返回的全部數據

相關文章
相關標籤/搜索