iOS開發-HTTP請求


  • 什么是URL?
    URL就是資源的地址、位置,互聯網上的每個資源都有一個唯一的URL
    URL的基本格式:


  • URL中常見的協議

    (1)HTTP

    超文本傳輸協議,訪問的是遠程的網絡資源,格式是http://

    http協議是在網絡開發中最常用的協議

    (2)file

    訪問的是本地計算機上的資源,格式是file://(不用加主機地址)

    (3)mailto

    訪問的是電子郵件地址,格式是mailto:

    (4)FTP

    訪問的是共享主機的文件資源,格式是ftp://

  • HTTP請求示例,返回JSON
        // 1.拼接一個請求路徑,請求參數跟在URL的后面以?隔開,多個參數之間以&符號拼接
        NSString *httpUrl = [NSString stringWithFormat:@"https://free-api.heweather.com/v5/weather?city=%@&key=XXX",[cityName stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
      //2.創建一個請求 NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:httpUrl]]; //3.將請求的url數據放到NSData對象中(同步請求,在主線程下載數據,執行時間根據數據大小變化) NSData *response = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; //4.解析數據,根據請求返回的類型,這里用IOS5自帶解析類NSJSONSerialization從response中解析出數據放到字典中 NSDictionary *jsonDict = [NSJSONSerialization JSONObjectWithData:response options:NSJSONReadingMutableLeaves error:nil];

    異步請求

    // 3.發送異步請求,收到返回數據后回到主線程執行任務
        [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
            if (connectionError || data == nil) {
                NSLog(@"網絡繁忙,請稍后嘗試");
            }
            // 4.解析數據,根據請求返回的類型,這里用IOS5自帶解析類NSJSONSerialization從response中解析出數據放到字典中
            NSDictionary *jsonDict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil];
        }];

     

  • HTTP請求返回XML

    一、XML簡單介紹

    XML:全稱是Extensible Markup Language,譯作“可擴展標記語言”

    跟JSON一樣,也是常用的一種用於交互的數據格式,一般也叫XML文檔(XML Document)

     

    XML舉例

    <videos>

        <video name="小黃人 第01部" length="30" />

        <video name="小黃人 第02部" length="19" />

        <video name="小黃人 第03部" length="33" />

    </videos>

    二、XML的語法

    1.簡單說明

    一個常見的XML文檔一般由以下部分組成

    文檔聲明

    元素(Element)

    屬性(Attribute)

     

    2.文檔聲明

    在XML文檔的最前面,必須編寫一個文檔聲明,用來聲明XML文檔的類型

    最簡單的聲明

    <?xml version="1.0" ?>

     

    用encoding屬性說明文檔的字符編碼

    <?xml version="1.0" encoding="UTF-8" ?>

     

    3.XML語法 – 元素(Element)

    一個元素包括了開始標簽和結束標簽

    擁有元素內容:<video>小黃人</video>

    沒有元素內容:<video></video>

    沒有元素內容的簡寫:<video/> 

     

    一個元素可以嵌套若干個子元素(不能出現交叉嵌套)

    <videos>

        <video>

            <name>小黃人 第01部</name>

             <length>30</length>

        </video>

    </videos>

     

    注意:

    (1)規范的XML文檔最多只有1個根元素,其他元素都是根元素的子孫元素

    (2)XML中的所有空格和換行,都會當做具體內容處理

    下面兩個元素的內容是不一樣的

    第1個

    <video>小黃人</video>

     

    第2個

    <video>

        小黃人

    </video>

     

    4.XML語法 – 屬性(Attribute)

    一個元素可以擁有多個屬性

    <video name="小黃人 第01部" length="30" />            ---->video元素擁有name和length兩個屬性

    注意:屬性值必須用 雙引號"" 或者 單引號'' 括住

     

    實際上,屬性表示的信息也可以用子元素來表示,比如

    <video>

        <name>小黃人 第01部</name>

            <length>30</length>

    </video>

     

    三、XML的解析

    1.簡單說明

    要想從XML中提取有用的信息,必須得學會解析XML

    提取name元素里面的內容

    <name>小黃人 第01部</name>

     

    提取video元素中name和length屬性的值

    <video name="小黃人 第01部" length="30" />

     

    XML的解析方式有2種

    (1)DOM:一次性將整個XML文檔加載進內存,比較適合解析小文件

    (3)SAX:從根元素開始,按順序一個元素一個元素往下解析,比較適合解析大文件

     

    2.IOS開發中XML的解析

    在iOS中,解析XML的手段有很多

    (1)蘋果原生   NSXMLParser:SAX方式解析,使用簡單

    (2)第三方框架

    1)libxml2:純C語言,默認包含在iOS SDK中,同時支持DOM和SAX方式解析

    2)GDataXML:DOM方式解析,由Google開發,基於libxml2

     

    XML解析方式的選擇建議:

    大文件:NSXMLParser、libxml2

    小文件:GDataXML

    用GDataXML解析XML數據



    用NSXMLParser解析


    實現<NSXMLParserDelegate>的代理方法




  • HTTP的GET請求和POST請求
    >GET: 1、在請求url后面以?的形式跟上發給服務器的參數,多個參數之間用&隔開,
    比如 http://www.test.com/login?username=123&pwd=234&type=JSON
              2、由於瀏覽器和服務器對URL長度有限制,因此在URL后面附帶的參數是限制的,通常不能超過1kb

    >HTTP:1、發給服務器的參數全部放在請求體中
               2、理論上,POST傳遞的數據量沒有限制(具體還得看服務器的處理能力)

    選擇:1).如果要傳遞大量數據,比如文件上傳,只能用post請求
           2).get的安全性比post要差些,如果包含機密\敏感信息,建議用post
           3).如果僅僅是索取數據(數據查詢),建議用get
           4).如果是增加、修改、刪除數據,建議使用post
  • GET和POST的區別:http://www.techweb.com.cn/network/system/2016-10-11/2407736.shtml

    GET請求上面已經說到,這里就不累述了,下面主要寫POST請求
    POST請求示例
       // 1.創建一個URL : 請求路徑
        NSURL *url = [NSURL URLWithString:@"http://192.168.15.172:8080/MJServer/login"];
        
        // 2.創建一個請求,這里使用NSMutableURLRequest,因為要設置其他屬性
        NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
      
        // 3.(可選)設置超時時間,5s后算請求超時(默認60s超時)
        request.timeoutInterval = 5;
        
        request.HTTPMethod = @"POST"; // **設置請求的類型 // 4.設置請求體
        NSString *param = [NSString stringWithFormat:@"username=%@&pwd=%@", usernameText, pwdText];
        // NSString --> NSData
        request.HTTPBody = [param dataUsingEncoding:NSUTF8StringEncoding];
        
        // 5.(可選)設置請求頭信息
        [request setValue:@"iPhone 6" forHTTPHeaderField:@"User-Agent"];
        
        // 6.發送一個異步請求,收到數據后返回主線程執行任務
        [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:
         ^(NSURLResponse *response, NSData *data, NSError *connectionError) {
            // 這個block會在請求完畢的時候自動調用
            if (connectionError || data == nil) { // 一般請求超時就會來到這
                [MBProgressHUD showError:@"請求失敗"];
                return;
            }
            
            // 解析服務器返回的JSON數據
            NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil];
    
         }];

     

  • 用POST發送JSON數據給服務器
        // 1.創建請求
        NSURL *url = [NSURL URLWithString:@"http://192.168.1.200:8080/MJServer/order"];
        NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
        request.HTTPMethod = @"POST";
        
        // 2.設置請求頭
        [request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
        
        // 3.設置請求體
        NSDictionary *json = @{
                               @"order_id" : @"123",
                               @"user_id" : @"789",
                               @"shop" : @"Toll"
                               };
    
        // NSDictionary --> NSData
        NSData *data = [NSJSONSerialization dataWithJSONObject:json options:NSJSONWritingPrettyPrinted error:nil];
        request.HTTPBody = data;
        
        // 4.發送請求
        [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
    
    }

     


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM