四种请求理解
同步请求
可以从网络上请求数据,一旦发送同步请求,程序将停止用户交互,直至服务器返回数据完成,才可以进行下一步操作。
数据的请求过程在主线程执行的,网络数据传输的过程会导致主线程堵塞。异步请求
不会阻塞主线程,而会建立一个新的线程来操作,用户发出异步请求后,依然可以对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];将要提交的数据放到请求体中。
此文主要是参考网上资料整理出来,仅供学习。