網(wǎng)絡(luò)請(qǐng)求之NSURLConnection和GET,POST請(qǐng)求

1. 常用類(lèi)

  • NSURL:請(qǐng)求地址

  • NSURLRequest:一個(gè)NSURLRequest對(duì)象就代表一個(gè)請(qǐng)求,它包含的信息有

    • 一個(gè)NSURL對(duì)象
    • 請(qǐng)求方法、請(qǐng)求頭、請(qǐng)求體
    • 請(qǐng)求超時(shí)
  • NSMutableURLRequest:NSURLRequest的子類(lèi)

  • NSURLConnection

    • 負(fù)責(zé)發(fā)送請(qǐng)求,建立客戶端和服務(wù)器的連接
    • 發(fā)送數(shù)據(jù)給服務(wù)器,并收集來(lái)自服務(wù)器的響應(yīng)數(shù)據(jù)

2. NSURLConnection的使用步驟

  • 使用NSURLConnection發(fā)送請(qǐng)求的步驟很簡(jiǎn)單
    • 創(chuàng)建一個(gè)NSURL對(duì)象,設(shè)置請(qǐng)求路徑
    • 傳入NSURL創(chuàng)建一個(gè)NSURLRequest對(duì)象,設(shè)置請(qǐng)求頭和請(qǐng)求體
    • 使用NSURLConnection發(fā)送請(qǐng)求
NSURLConnection的請(qǐng)求過(guò)程.png

3. NSURLConnection發(fā)送請(qǐng)求

  • NSURLConnection常見(jiàn)的發(fā)送請(qǐng)求方法有以下幾種

    • 3.1同步請(qǐng)求
+ (NSData *)sendSynchronousRequest:(NSURLRequest *)request returningResponse:(NSURLResponse **)response error:(NSError **)error;
  • 3.2異步請(qǐng)求:根據(jù)對(duì)服務(wù)器返回?cái)?shù)據(jù)的處理方式的不同,又可以分為2種
    • 3.2.1 block回調(diào)
+ (void)sendAsynchronousRequest:(NSURLRequest*) request  queue:(NSOperationQueue*) queue  
completionHandler:(void (^)(NSURLResponse* response, NSData* data, NSError* connectionError)) handler;
  • 3.2.2 代理
- (id)initWithRequest:(NSURLRequest *)request delegate:(id)delegate;
+ (NSURLConnection*)connectionWithRequest:(NSURLRequest *)request delegate:(id)delegate;
- (id)initWithRequest:(NSURLRequest *)request delegate:(id)delegate startImmediately:(BOOL)startImmediately;
  • 在startImmediately = NO的情況下,需要調(diào)用start方法開(kāi)始發(fā)送請(qǐng)求
- (void)start;
  • 成為NSURLConnection的代理,最好遵守NSURLConnectionDataDelegate協(xié)議

  • NSURLConnectionDataDelegate協(xié)議中的代理方法

開(kāi)始接收到服務(wù)器的響應(yīng)時(shí)調(diào)用
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response;

接收到服務(wù)器返回的數(shù)據(jù)時(shí)調(diào)用(服務(wù)器返回的數(shù)據(jù)比較大時(shí)會(huì)調(diào)用多次)
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data;

服務(wù)器返回的數(shù)據(jù)完全接收完畢后調(diào)用
- (void)connectionDidFinishLoading:(NSURLConnection *)connection;

請(qǐng)求出錯(cuò)時(shí)調(diào)用(比如請(qǐng)求超時(shí))
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error;

4. NSMutableURLRequest

  • NSMutableURLRequest是NSURLRequest的子類(lèi),常用方法有
設(shè)置請(qǐng)求超時(shí)等待時(shí)間(超過(guò)這個(gè)時(shí)間就算超時(shí),請(qǐng)求失敗)
- (void)setTimeoutInterval:(NSTimeInterval)seconds;

設(shè)置請(qǐng)求方法(比如GET和POST)
- (void)setHTTPMethod:(NSString *)method;

設(shè)置請(qǐng)求體
- (void)setHTTPBody:(NSData *)data;

設(shè)置請(qǐng)求頭
- (void)setValue:(NSString *)value forHTTPHeaderField:(NSString *)field;

5. 創(chuàng)建GET和POST請(qǐng)求

  • 創(chuàng)建GET請(qǐng)求
NSString *urlStr = [@"http://120.25.226.186:32812/login?username=123&pwd=123" stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSURL *url = [NSURL URLWithString:urlStr];

// 2. 創(chuàng)建請(qǐng)求對(duì)象
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

// 3. 發(fā)送GET請(qǐng)求
[NSURLConnection sendAsynchronousRequest:request queue:[[NSOperationQueue alloc] init] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
        
        
        // 4. 解析數(shù)據(jù)
        NSLog(@"網(wǎng)絡(luò)請(qǐng)求到的數(shù)據(jù):%@",[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
        
        NSHTTPURLResponse * httpResponse = (NSHTTPURLResponse *)response;
        NSLog(@"%zd",httpResponse.statusCode);
        NSLog(@"線程:%@",[NSThread currentThread]);
        
    }];
  • 創(chuàng)建POST請(qǐng)求
// 1. 確定請(qǐng)求路徑
    NSURL * url = [NSURL URLWithString:@"http://120.25.226.186:32812/login"];
    
    // 2. 創(chuàng)建可變的請(qǐng)求對(duì)象
    NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:url];
    
    // 3. 修改請(qǐng)求方法,POST 必須大寫(xiě)
    request.HTTPMethod = @"POST";
    
    // 設(shè)置屬性,請(qǐng)求超時(shí)(如果超過(guò)10秒,不管有沒(méi)有接收到數(shù)據(jù),客戶端都認(rèn)為請(qǐng)求失敗)
    request.timeoutInterval = 10;
    
    // 設(shè)置請(qǐng)求頭 User-Agent
    [request setValue:@"iOS 8.1" forHTTPHeaderField:@"User-Agent"];
    
    // 4. 設(shè)置請(qǐng)求體信息,字符串 --> NSData
    request.HTTPBody = [@"username=520it&pwd=520it&type=JSON" dataUsingEncoding:NSUTF8StringEncoding];
    
    // 5. 發(fā)送請(qǐng)求
    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
        
        
        // 6. 解析數(shù)據(jù), NSData --> NSString
        NSLog(@"解析到的數(shù)據(jù)為:%@",[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
        
    }];
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容