Http方法:Get請求與Post請求的區別
Get是向服務器發索取數據的一種請求,而Post是向服務器提交數據的一種請求
Get是獲取信息,而不是修改信息,相似數據庫查詢功能同樣,數據不會被修改
Get請求的參數會跟在url後進行傳遞,請求的數據會附在URL以後,以?分割URL和傳輸數據,參數之間以&相連,%XX中的XX爲該符號以16進製表示的ASCII,若是數據是英文字母/數字,原樣發送,若是是空格,轉換爲+,若是是中文/其餘字符,則直接把字符串用BASE64加密。
Get傳輸的數據有大小限制,由於GET是經過URL提交數據,那麼GET可提交的數據量就跟URL的長度有直接關係了,不一樣的瀏覽器對URL的長度的限制是不一樣的。
GET請求的數據會被瀏覽器緩存起來,用戶名和密碼將明文出如今URL上,其餘人能夠查到歷史瀏覽記錄,數據不太安全。在服務器端,用Request.QueryString來獲取Get方式提交來的數據
Post請求則做爲http消息的實際內容發送給web服務器,數據放置在HTML Header內提交,Post沒有限制提交的數據。Post比Get安全,當數據是中文或者不敏感的數據,則用get,由於使用get,參數會顯示在地址,對於敏感數據和不是中文字符的數據,則用post
POST表示可能修改變服務器上的資源的請求,在服務器端,用Post方式提交的數據只能用Request.Form來獲取
1、get請求 Get請求的參數會跟在url後進行傳遞,請求的數據會附在URL以後,以?分割URL和傳輸數據,參數之間以&相連
1.請求地址 url
NSURL *url = [NSURL URLWithString:urlString];
2. 獲取絕對路徑與參數字符串之間的分隔符。判斷URL是否已經帶有參數,參數存在的話,後面填充@「&」
NSString *str = url.query?@"&":@"?";
*3.獲取參數字符串paramsString(字典轉換成字符串,根據條件,該步可省略)
NSMutableString *paramsString = [[NSMutableString alloc] init];
for (NSString *key in params) {
[paramsString appendFormat:@"%@=%@",key,[params objectForKey:key]];
if (key != [[params allKeys] lastObject]) {
[paramsString appendString:@"&"];
}
}
4. 獲取請求的最終路徑
NSString *fullString = [urlString stringByAppendingFormat:@"%@%@",str,paramsString];
5.構造請求
NSURLRequest *request = [[NSURLRequest alloc] initWithURL:[NSURL URLWithString:fullString] cachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData timeoutInterval:60];
//NSURLRequestCachePolicy 緩存策略
6.建立session
NSURLSessionConfiguration *cofiguration = [NSURLSessionConfiguration defaultSessionConfiguration];
NSURLSession *session = [NSURLSession sessionWithConfiguration:cofiguration];
7.建立任務
(Data Task加載數據)
NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
if (error) {
NSLog(@"請求失敗");
}
// 將獲取的數據從NSData換成JSON id類型數據
id jsonObject = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];
}];
8. 開始執行任務
[task resume];
2、post請求 Post請求則做爲http消息的實際內容發送給web服務器,數據放置在HTML Header內提交
1.請求地址 url
NSURL *url = [NSURL URLWithString:urlString];
2.構造網絡請求
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
**獲取參數字符串paramsString(字典轉換成字符串,根據條件,該步可省略)
NSMutableString *paramsString = [[NSMutableString alloc] init];
for (NSString *key in params) {
[paramsString appendFormat:@"%@=%@",key,[params objectForKey:key]];
if (key != [[params allKeys] lastObject]) {
[paramsString appendString:@"&"];
}
} **
NSData *dataBody = [paramsString dataUsingEncoding:NSUTF8StringEncoding];
request.HTTPBody = dataBody;
request.HTTPMethod = @"POST";
request.timeoutInterval = 60;
3.建立session對象
NSURLSession *session = [NSURLSession sharedSession];
4.建立任務(Data Task加載數據)
NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
if (error) {
NSLog(@"請求失敗");
}
// 解析json數據
id jsonOb = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];
}];
5.開始任務
[task resume];
3、下載任務
1.請求地址 url
2.建立請求
NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReturnCacheDataElseLoad timeoutInterval:10];
3.建立session
NSURLSessionConfiguration *cofiguration = [NSURLSessionConfiguration defaultSessionConfiguration];
NSURLSession *session = [NSURLSession sessionWithConfiguration:configuration delegate:self delegateQueue:[NSOperationQueue mainQueue]];
4.建立任務(Download Task用於完成下載文件的任務)
帶有block回調 不會執行代理方法
NSURLSessionDownloadTask *downloadTask = [session downloadTaskWithRequest:request completionHandler:^(NSURL * _Nullable location, NSURLResponse * _Nullable response, NSError * _Nullable error) {
//loaction:下載文件的存儲路徑
//當前獲取到的文件 僅是臨時文件 block調用完後文件被銷燬
NSLog(@"location:%@",location);
}];
*4.建立任務 使用不帶有block回調的下載任務建立 會執行代理方法
downloadTask = [session downloadTaskWithRequest:request];
5.任務執行
[downloadTask resume];
6.下載的暫停和繼續(斷點續傳)
6.1暫停
[downloadTask cancelByProducingResumeData:^(NSData * _Nullable resumeData) {
//將下載的數據保留
_resumeData = resumeData;//全局,方便繼續任務時找到繼續下載的斷點
//銷燬當前的下載任務
downloadTask = nil;
}];
6.2繼續下載
downloadTask = [_session downloadTaskWithResumeData:_resumeData];
//執行下載
[downloadTask resume];
7. NSURLDownLoadDelegate的方法
7.1完成下載時調用該方法
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask
didFinishDownloadingToURL:(NSURL *)location
{
NSLog(@"下載完成 location:%@",location);
}
7.2下載時實時調用 能夠計算下載進度
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask
didWriteData:(int64_t)bytesWritten
totalBytesWritten:(int64_t)totalBytesWritten
totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite
{
/*
bytesWritten:本次下載的數據大小
totalBytesWritten:當前總共下載的數據大小
totalBytesExpectedToWrite:要下載文件的總大小
*/
NSLog(@"當前下載進度:%.2f%%",(float)totalBytesWritten/(float)totalBytesExpectedToWrite*100);
}
4、上傳任務
1.請求地址 url
2.建立request請求
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestReturnCacheDataElseLoad timeoutInterval:10];
3.設置request請求
3.1 請求方式
request.HTTPMethod = @"POST";
3.2 請求頭設置
[request setValue:@"multipart/form-data; boundary=wj"forHTTPHeaderField:@"Content-type"];
3.3 API所需參數
NSDictionary *parameters = @{@"access_token":@"2.00mJ342GxqpRWCefc4cfde8ecuw6YC",@"status":@"進進進進"};
3.4 要上傳的文件( 將圖片轉化成二進制數據)
NSString *path = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"jpg"];
NSData *imgData = [NSData dataWithContentsOfFile:path];
3.5 拼接請求體
NSString*preBoundary = [NSString stringWithFormat:@"--%@", @"wj"];
NSString*endBoundary = [NSString stringWithFormat:@"--%@--",@"wj"];
NSMutableString *body = [[NSMutableString alloc] init];
//遍歷keys
for(NSString*key in parameters)
{
//獲得當前key
//若是key不是pic,說明value是字符類型,好比name:Boris
//添加分界線,換行 必須使用 \r\n
[body appendFormat:@"%@\r\n",preBoundary];
//添加字段名稱,換2行
[body appendFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n",key];
//添加字段的值
[body appendFormat:@"%@\r\n",[parameters objectForKey:key]];
}
////添加分界線,換行
[body appendFormat:@"%@\r\n",preBoundary];
//聲明pic字段,文件名爲boris.png
[body appendFormat:@"Content-Disposition: form-data; name=\"%@\"; filename=\"%@\"\r\n", @"pic", @"pic.png"];
//聲明上傳文件的格式
[body appendFormat:@"Content-Type: %@\r\n\r\n", @"image/png"];
//聲明結束符:--wj--
NSString *end=[[NSString alloc]initWithFormat:@"\r\n%@",endBoundary];
//聲明myRequestData,用來放入http body
NSMutableData *myRequestData=[NSMutableData data];
//將body字符串轉化爲UTF8格式的二進制
[myRequestData appendData:[body dataUsingEncoding:NSUTF8StringEncoding]];
//將image的data加入
[myRequestData appendData:imgData];
//加入結束符--wj--
[myRequestData appendData:[end dataUsingEncoding:NSUTF8StringEncoding]];
3.6 設置請求體
request.HTTPBody = formData;
4. 建立上傳任務 (Upload Task用於完成上傳文件任務)
NSURLSessionUploadTask *upload = [_session uploadTaskWithRequest:request fromData:formData completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
if (!error) {
NSLog(@"上傳完成");
}
}];
5.執行任務
[upload resume];