網路處理2-非同步POST請求和同步請求

來源:互聯網
上載者:User

標籤:

本文目錄
  • 一、非同步POST請求
  • 二、NSURLConnection的其他要求方法

上一講介紹了iOS中的非同步GET請求,這講來看看非同步POST請求。

回到頂部一、非同步POST請求

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

  • username :母雞
  • pwd :123
1.POST請求細節分析

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

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

2> POST請求需要發送兩部分的資料到伺服器端:

* 請求體內容:所有的請求參數

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

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

 

* 要求標頭資訊:請求體長度、請求資料的類型

(這是我在FireBug中類比POST請求的)

Content-Length是指請求體長度,Content-Type是指請求資料類型

 

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請求時,會自動根據請求體內容加上相應的要求標頭資訊

 

回到頂部二、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對象,存放著伺服器返回的所有資料

原作者,M了個J

網路處理2-非同步POST請求和同步請求

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.