iOS网络请求

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底下打印");
}

推荐阅读更多精彩内容