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来获取
一、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:@"&"];
}
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) {
if (error) {
NSLog(@"请求失败");
}
// 将获取的数据从NSData换成JSON id类型数据
id jsonObject = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];
}];
8. 开始执行任务
[task resume];
二、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:@"&"];
}
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];
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];
id jsonOb = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];
}];
5.开始任务
5.开始任务
[task resume];
三、下载任务
1.请求地址 url
NSURL *url = [NSURL URLWithString:@"http://dl1.52pk.com:8088/soft/2013/Microsoft.Office.2010.CR_52pk.zip"];
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);
//当前获取到的文件 仅是临时文件 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;
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);
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);
}
四、上传任务
1.请求地址 url
NSURL *url = [NSURL URLWithString:@"https://upload.api.weibo.com/2/statuses/upload.json"]; //微博上上传图片接口
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
//添加分界线,换行 必须使用
[body appendFormat:@"%@ ",preBoundary];
//添加字段名称,换2行
[body appendFormat:@"Content-Disposition: form-data; name="%@" ",key];
//添加字段的值
//得到当前key
//如果key不是pic,说明value是字符类型,比如name:Boris
//添加分界线,换行 必须使用
[body appendFormat:@"%@ ",preBoundary];
//添加字段名称,换2行
[body appendFormat:@"Content-Disposition: form-data; name="%@" ",key];
//添加字段的值
[body appendFormat:@"%@
",[parameters objectForKey:key]];
}
////添加分界线,换行
[body appendFormat:@"%@ ",preBoundary];
//声明pic字段,文件名为boris.png
[body appendFormat:@"Content-Disposition: form-data; name="%@"; filename="%@"
", @"pic", @"pic.png"];
//声明上传文件的格式
[body appendFormat:@"Content-Type: %@
", @"image/png"];
//声明结束符:--wj--
NSString *end=[[NSString alloc]initWithFormat:@" %@",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.执行任务
if (!error) {
NSLog(@"上传完成");
}
}];
5.执行任务
[upload resume];