HTTP協議
HTTP協議,Hyper Text Transfer Protocol(超⽂本傳輸協議)是 ⽤於從萬維⺴服務器傳送超⽂本到本地瀏覽器的傳輸協議,HTTP是 ⼀個應⽤層協議,由請求和響應構成,是⼀個標準的客戶端服務器 模型。
http 3次握手 用戶連續向服務器3次發送一樣的請求 第三次服務器不再詢問,開始執行
url:統一資源定位符,也被成爲網址,因特網上標準的資源網址
url的符語法: 協議://授權/路徑?查詢
協議: ftp:// (文件傳輸協議) http://(超文本傳輸協議) https://(安全超文本傳輸協議) file://(本地文件協議)
GET與POST的區別:
GET:通過網址字符串 最多255字節
POST:使用NSData,容量超過1G
利用get請求 請求一個網址時 明文顯示(攜帶的信息不安全)
post: 數據被轉成NSData(二進制數據),類似於密碼的密文輸入,無法直接讀取.
連接方式:
同步連接: 會造成程序的卡頓(只有當請求完成 纔會恢復對界面的操作 用戶體驗很差)
異步連接:等待數據返回
異步連接有兩種實現方式: 設置代理 接收數據
實現block
GET請求
不管同步還是異步前面4步的步驟是一樣的
// 1.網址中有中文的需要轉化一下格式 中文不能直接轉 沒有就不需要
NSString *newStr = [kSearchURL stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
// 2.把字符串的網址轉化爲網址對象
NSURL *url = [NSURL URLWithString:newStr];
// 3.創建一個請求
// timeoutInterval 請求超時的時間 秒爲單位
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:(NSURLRequestUseProtocolCachePolicy) timeoutInterval:10];
// 4.設置一個請求的標誌 標識符很重要
[request setHTTPMethod:@"GET"];
**同步時:**
// 5.建立同步連接 並得到返回的數據
NSData * data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
後面兩個對象可以爲空 一個是服務器響應信息 一個是錯誤信息
// 6.解析數據
**異步時:**
代理方法:
// 5.利用請求 創建一個異步連接
self.connection = [NSURLConnection connectionWithRequest:request delegate:self];
// 6.開始連接
[self.connection start]
然後實現代理方法
a.接收到服務器的響應信息時觸發的方法 連接成功裏面 創建data
b.接收到數據觸發的方法(走很多次)多次觸發這個方法才能接收到完整的data 所以需要拼接一下data
[self.data appendData:data];
c.已經完成數據加載 觸發的方法 解析數據在這裏面進行 **如果在tableView上展示的話 注意刷新界面**
d.請求失敗時觸發
block異步連接方法
// [NSOperationQueue mainQueue]
// 代表回到主線程
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
// 當數據請求完成的時候會指定 這個block
NSLog(@"%@",data);
// 判斷是否在主線程
NSLog(@"%d",[NSThread isMainThread]);
}];
POST與GET差不多,這不過POST的url與data是分開的
區別:POST請求 可以攜帶一個請求體
NSData *data = [kNewsListParam dataUsingEncoding:NSUTF8StringEncoding];
[request setHTTPBody:data];
其他是一樣的.
獲取服務器響應信息的長度 long long 類型的response.expectedContentLength
data.length 得到的data的長度
以獲取到data的形式得到image
UIImage *image = [UIImage imageWithData:self.data];