四種請求理解
同步請求
可以從網絡上請求數據,一旦發送同步請求,程序將停止用戶交互,直至服務器返回數據完成,才可以進行下一步操作。
數據的請求過程在主線程執行的,網絡數據傳輸的過程會導致主線程堵塞。異步請求
不會阻塞主線程,而會建立一個新的線程來操作,用戶發出異步請求后,依然可以對UI進行操作,程序可以繼續運行。
數據的請求過程在多線程執行的,保持主線程的流暢性,UI界面的渲染與刷新在主線程中,主線程不流暢會導致UI界面卡頓。GET請求
get請求將參數直接寫在訪問路徑上。操作簡單,不過容易被外界看到,安全性不高,地址最多255字節;POST請求
post請求將參數放到body里面。POST請求操作相對復雜,需要將參數和地址分開,不過安全性高,參數放在body里面,不易被捕獲。
get 請求
實現步驟
確定請求路徑,GET請求參數直接跟在URL后面
創建請求對象(默認包含了請求頭和請求方法 GET )
使用NSURLSession創建會話對象
根據會話對象創建請求任務(使用NSURLSessionDataTask)
執行Task
當得到服務器返回的響應后,再解析數據
代碼示例
發送GET請求的第一種方法
-(void)getOne
{
//對請求路徑的說明
//http://120.25.226.186:32812/login?username=520it&pwd=520&type=JSON
//協議頭+主機地址+接口名稱+?+參數1&參數2&參數3
//協議頭(http://)+主機地址(120.25.226.186:32812)+接口名稱(login)+?+參數1(username=520it)&參數2(pwd=520)&參數3(type=JSON)
//GET請求,直接把請求參數跟在URL的后面以?隔開,多個參數之間以&符號拼接
//1.確定請求路徑
NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/login?username=520it&pwd=520it&type=JSON"];
//2.創建請求對象
//請求對象內部默認已經包含了請求頭和請求方法(GET)
NSURLRequest *request = [NSURLRequest requestWithURL:url];
//3.獲得會話對象
NSURLSession *session = [NSURLSession sharedSession];
//4.根據會話對象創建一個Task(發送請求)
/*
第一個參數:請求對象
第二個參數:completionHandler回調(請求完成【成功|失敗】的回調)
data:響應體信息(期望的數據)
response:響應頭信息,主要是對服務器端的描述
error:錯誤信息,如果請求失敗,則error有值
*/
NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
if (error == nil) {
//6.解析服務器返回的數據
//說明:(此處返回的數據是JSON格式的,因此使用NSJSONSerialization進行反序列化處理)
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil];
NSLog(@"%@",dict);
}
}];
//5.執行任務
[dataTask resume];
}
發送GET請求的第二種方法
-(void)getTwo
{
//1.確定請求路徑
NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/login?username=520it&pwd=520it&type=JSON"];
//2.獲得會話對象
NSURLSession *session = [NSURLSession sharedSession];
//3.根據會話對象創建一個Task(發送請求)
/*
第一個參數:請求路徑
第二個參數:completionHandler回調(請求完成成功或者失敗 的回調)
data:響應體信息(期望的數據)
response:響應頭信息,主要是對服務器端的描述
error:錯誤信息,如果請求失敗,則error有值
注意:
1)該方法內部會自動將請求路徑包裝成一個請求對象,該請求對象默認包含了請求頭信息和請求方法(GET)
2)如果要發送的是POST請求,則不能使用該方法
\*/
NSURLSessionDataTask *dataTask = [session dataTaskWithURL:url completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
//5.解析數據
NSDictionary * dict = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil];
NSLog(@"%@",dict);
}];
//4.執行任務
[dataTask resume];
}
post 數據傳輸
實現步驟
確定請求路徑
創建可變的請求對象
修改請求方法為POST
設置請求體,把參數轉換為二進制數據,然后設置請求體
創建會話對象(NSURLSession)
根據會話對象創建請求任務(NSURLSessionDataTask)
執行Task
當得到服務器返回的響應后,然后解析數據
-(void)post
{
//對請求路徑的說明
//http://120.25.226.186:32812/login
//協議頭+主機地址+接口名稱
//協議頭(http://)+主機地址+接口名稱
//POST請求需要修改請求方法為POST,并把參數轉換為二進制數據 再設置為請求體
//1.創建會話對象
NSURLSession *session = [NSURLSession sharedSession];
//2.根據會話對象創建task
NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/login"];
//3.創建可變的請求對象
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
//4.修改請求方法為POST
request.HTTPMethod = @"POST";
//5.設置請求體
request.HTTPBody = [@"username=520it&pwd=520it&type=JSON" dataUsingEncoding:NSUTF8StringEncoding];
//6.根據會話對象創建一個Task(發送請求)
/*
第一個參數:請求對象
第二個參數:completionHandler回調(請求完成【成功|失敗】的回調)
data:響應體信息(期望的數據)
response:響應頭信息,主要是對服務器端的描述
error:錯誤信息,如果請求失敗,則error有值
*/
NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
//8.解析數據
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil];
NSLog(@"%@",dict);
}];
//7.執行任務
[dataTask resume];
}
數據傳輸方式get和post的區別
從表面的意思看get 和 post的區別get就是獲取數據,post就是發送數據。這個是誤區。其實兩者都可以的,在iOS向服務器發送請求里面可以帶參數。
一般在瀏覽器中輸入網址訪問資源都是通過GET方式;可以通過Method指定提交方式為GET或者POST,默認為GET提交 。
兩種請求方式的區別:
- GET會把要傳的信息拼接到url中。而POST將數據放在BODY中。
- GET的URL會有長度上的限制,則POST的數據則可以非常大。
- POST的安全性要比GET的安全性高。
POST參數是以一個字符串方式傳遞: "name=huacaocoder&password=123”
[request setHTTPMethod:@"POST"]; 知道請求方法為POST方法,但是要注意POST必須大寫。
[request setHTTPBody:postData];將要提交的數據放到請求體中。
此文主要是參考網上資料整理出來,僅供學習。