http协议整个请求过程:
① 先建立TCP链接,三次握手
② 根据网址(NSURL:同一资源定位符,网址就是资源,我们所需要的数据在服务器端存储的位置)向网址发送请求(NSURLRequest),请求一般包含请求头(一般不用做改动),请求体(这里能看到的就是POST请求的时候需要给参数)。请求一般用到两种GET和POST。GET:一般情况下都是将参数拼接在网址后边,但是不是将参数拼接在网址后边的就是GET请求。GET请求一般能传递的数据大小为255字节。由于它是将参数拼接在网址后边,其他人员可以看到该参数,所以安全性较差。POST:在实际代码中使用的是(NSMutableURLRequest),是将参数转换为NSData类型,发送给服务器,一般不是直接拼接在网址后边,它可以传输的数据量理论上是无限制的,安全性较好。
③ 发送请求,建立客户端与服务器端的链接(NSURLConnection),连接的方式分为两种:同步和异步,同步:当建立同步连接的时候,该请求没有返回数据的时候,那么其他操作都不能进行。如果实在代码中,同步请求未结束,它底下的代码不会执行。异步:异步连接,在数据未返回的时候,我们可以进行其它操作,在代码中的体现就是,发送了请求之后,即使数据未返回,它底下的代码也可以执行。异步的实现方式有两种,一种是通过代理,一种是block回调。
④ 得到服务器的返回数据(NSURLResponse),返回也会包括响应头,响应体(实际上所需要的数据)。
⑤ 断开TCP连接,四次分手。
GET同步请求
- (void)getAndSynchronousMethod
{
//定义URL网址
NSString *urlString = @"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx?date=20151031&startRecord=1&len=5&udid=1234567890&terminalType=Iphone&cid=213";
NSURL *url = [NSURL URLWithString:urlString];
//初始化请求方式,默认为GET
NSURLRequest *request = [NSURLRequest requestWithURL:url];
NSError *error;
// 创建同步连接,request:请求对象,里边承载着我们的请求信息,有网址,请求头等信息。response:请求的返回(响应),里面包含了响应头的一些信息,如果需要响应头,需要传递此参数,一般不需要。error:请求出错的时候,会有错误信息保存在该参数中,一般置为nil,可以根据返回数据来判断是否请求有问题
NSData *receiveData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:&error];
[self jsonParserWithData:receiveData];
}
POST同步请求
- (void)postAndSynchronousMethod
{
NSString *urlString = @"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx";
//date=20151031&startRecord=1&len=5&udid=1234567890&terminalType=Iphone&cid=213
NSURL *url = [NSURL URLWithString:urlString];
//创建POST请求参数,为NSData类型
NSString *postString = @"date=20151031&startRecord=1&len=5&udid=1234567890&terminalType=Iphone&cid=213";
//将string类型转换为NSData类型
NSData *postParameterData = [postString dataUsingEncoding:NSUTF8StringEncoding];
//创建请求,因为NSURLRequest类型不能设置请求方式,所以如果是post请求,就得使用它的子类NSMutableURLRequest
NSMutableURLRequest *mutableReq = [NSMutableURLRequest requestWithURL:url];
//设置请求方式
mutableReq.HTTPMethod = @"POST";
//设置请求参数
mutableReq.HTTPBody = postParameterData;
//建立同步连接
NSData *receiveData = [NSURLConnection sendSynchronousRequest:mutableReq returningResponse:nil error:nil];
[self jsonParserWithData:receiveData];
}
POST异步 实现方式block
- (void)postAndAsynchronousMethod
{
NSURL *url = [NSURL URLWithString:@"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx"];
NSData *postData = [[NSString stringWithFormat:@"date=20151031&startRecord=1&len=5&udid=1234567890&terminalType=Iphone&cid=213"] dataUsingEncoding:NSUTF8StringEncoding];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
//设置请求方式
request.HTTPMethod = @"POST";
//设置请求参数
request.HTTPBody = postData;
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
[self jsonParserWithData:data];
}];
NSLog(@"123456");
}
GET异步 实现方式block
- (void)getAndAsynchronousMethod
{
NSURL *url = [NSURL URLWithString:@"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx?date=20151031&startRecord=1&len=5&udid=1234567890&terminalType=Iphone&cid=213"];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
//异步连接,block实现
//queue:需要将请求连接放到一个队列中,目前,我们是将该请求放到主队列中,在主队列中操作所占有的资源的优先等级高
//completionHandler:请求有返回结果时,会执行该block回调
//block中的参数:response:请求返回的响应,内部包含响应头。data:是我们所需要的实际数据。connectionError:请求出错时返回的错误信息
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
[self jsonParserWithData:data];
}];
NSLog(@"我实在异步block底下打印");
}