- 什么是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) { }