首先我們來創建一個URL
~~~
NSURL *url = [NSURL URLWithString:@"http://m.baidu.com"];
~~~
m:mobile專門給手機提供訪問的連接
**創建請求對象,根據url向服務器索要數據**
~~~
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:15];
~~~
- 這個方法里面,我們要做的事情:
- 通過NSMutableURLRequest告訴服務器一些額外的信息
- timeoutInterval:請求超時時長,在指定的時間內,如果沒有得到服務器的響應,則認為請求是失敗的
- 默認是60s 但是建議在15~30s之間
- cachePolicy 緩存策略
- NSURLRequestUseProtocolCachePolicy = 0, 默認的策略
- NSURLRequestReloadIgnoringLocalCacheData = 1,每次從服務器加載,忽略本地緩存。
- 一般使用在實時性要求很高的應用,股票/12306/
- 下面兩個一般使用在開發離線版應用。
- 離線版應用一般需要兩個數據庫,一個是本地數據庫Sqlite3,一個服務器數據庫。
- NSURLRequestReturnCacheDataElseLoad = 2, 有緩存,就返回緩存數據,沒有就從服務器加載。
- NSURLRequestReturnCacheDataDontLoad = 3, 有緩存,就返回緩存數據,沒有就不加載
- 告訴服務器,我是iPhone 并且支持Apple的網頁套件
~~~
[request setValue:@"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_1) AppleWebKit/601.2.7 (KHTML, like Gecko) Version/9.0.1 Safari/601.2.7" forHTTPHeaderField:@"User-Agent"];
~~~
- 將請求對象發送給服務器–(網絡訪問都是耗時操作,使用異步)
- sendAsynchronousRequest:本身是異步,NSURLConnection內部會開啟一條線程進行網絡訪問
- queue:決定了completionHandler回調所在的線程
- **如何選擇隊列**
- 如果獲得服務器響應的時候,要做耗時操作,則選擇自己創建隊列,比如下載一個zip包,解壓縮
- 如果獲得響應后直接更新UI,則選擇主隊列。
completionHandler:服務器響應客戶端的回調。
**response**
本質是NSHTTPURLResponse
- statusCode:狀態碼,可以根據這個值判斷是否請求出錯。
- allHeaderFields:獲得響應體
- URL:一般使用在重定向,如果不需要重定向,響應的url和請求的url是一樣的。
- MIMEType:服務器告訴客戶端返回的數據類型,并決定客戶端使用什么軟件查看內容
-
textEncodingName : 服務器告訴客戶端返回內容的編碼格式
**下面兩個屬性一般使用在開發下載功能**
-
expectedContentLength:服務器返回數據的長度,客戶端可以通過該屬性獲得文件大
- suggestedFilename:服務器建議客戶端保存文件使用的名字
如下:
~~~
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
if(connectionError != nil || data.length == 0) {
NSLog(@"你的網絡不給力哦");
return;
}
NSString *html = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
~~~
**加載html**
~~~
[self.webView loadData:data MIMEType:response.MIMEType textEncodingName:response.textEncodingName baseURL:url];
~~~