美文网首页
IOS之同步请求、异步请求、GET请求、POST请求

IOS之同步请求、异步请求、GET请求、POST请求

作者: lilinjianshu | 来源:发表于2016-05-30 17:37 被阅读4026次

    1、同步请求可以从因特网请求数据,一旦发送同步请求,程序将停止用户交互,直至服务器返回数据完成,才可以进行下一步操作,

    2、异步请求不会阻塞主线程,而会建立一个新的线程来操作,用户发出异步请求后,依然可以对UI进行操作,程序可以继续运行

    3、GET请求,将参数直接写在访问路径上。操作简单,不过容易被外界看到,安全性不高,地址最多255字节;

    4、POST请求,将参数放到body里面。POST请求操作相对复杂,需要将参数和地址分开,不过安全性高,参数放在body里面,不易被捕获。

    1、    同步GET请求

    //第一步,创建URL

    NSURL *url = [NSURL URLWithString:@"http://api.hudong.com/iphonexml.do?type=focus-c"];

    //第二步,通过URL创建网络请求

    NSURLRequest *request = [[NSURLRequest alloc]initWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10];

    //NSURLRequest初始化方法第一个参数:请求访问路径,第二个参数:缓存协议,第三个参数:网络请求超时时间(秒)

    其中缓存协议是个枚举类型包含:

    NSURLRequestUseProtocolCachePolicy(基础策略)

    NSURLRequestReloadIgnoringLocalCacheData(忽略本地缓存)

    NSURLRequestReturnCacheDataElseLoad(首先使用缓存,如果没有本地缓存,才从原地址下载)

    NSURLRequestReturnCacheDataDontLoad(使用本地缓存,从不下载,如果本地没有缓存,则请求失败,此策略多用于离线操作)

    NSURLRequestReloadIgnoringLocalAndRemoteCacheData(无视任何缓存策略,无论是本地的还是远程的,总是从原地址重新下载)

    NSURLRequestReloadRevalidatingCacheData(如果本地缓存是有效的则不下载,其他任何情况都从原地址重新下载)

    //第三步,连接服务器

    NSData *received = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];

    NSString *str = [[NSString alloc]initWithData:received encoding:NSUTF8StringEncoding];

    NSLog(@"%@",str);

    2、同步POST请求

    //第一步,创建URL

    NSURL *url = [NSURL URLWithString:@"http://api.hudong.com/iphonexml.do"];

    //第二步,创建请求

    NSMutableURLRequest *request = [[NSMutableURLRequest alloc]initWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10];

    [request setHTTPMethod:@"POST"];//设置请求方式为POST,默认为GET

    NSString *str = @"type=focus-c";//设置参数

    NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding];

    [request setHTTPBody:data];

    //第三步,连接服务器

    NSData *received = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];

    NSString *str1 = [[NSString alloc]initWithData:received encoding:NSUTF8StringEncoding];

    NSLog(@"%@",str1);

    3、异步GET请求

    //第一步,创建url

    NSURL *url = [NSURL URLWithString:@"http://api.hudong.com/iphonexml.do?type=focus-c"];

    //第二步,创建请求

    NSURLRequest *request = [[NSURLRequest alloc]initWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10];

    //第三步,连接服务器

    NSURLConnection *connection = [[NSURLConnection alloc]initWithRequest:request delegate:self];

    4、异步POST请求

    //第一步,创建url

    NSURL *url = [NSURL URLWithString:@"http://api.hudong.com/iphonexml.do"];

    //第二步,创建请求

    NSMutableURLRequest *request = [[NSMutableURLRequest alloc]initWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10];

    [request setHTTPMethod:@"POST"];

    NSString *str = @"type=focus-c";

    NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding];

    [request setHTTPBody:data];

    //第三步,连接服务器

    NSURLConnection *connection = [[NSURLConnection alloc]initWithRequest:request delegate:self];

    5、异步请求的代理方法

    //接收到服务器回应的时候调用此方法

    - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response

    {

    NSHTTPURLResponse *res = (NSHTTPURLResponse *)response;

    NSLog(@"%@",[res allHeaderFields]);

    self.receiveData = [NSMutableData data];

    }

    //接收到服务器传输数据的时候调用,此方法根据数据大小执行若干次

    -(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data

    {

    [self.receiveData appendData:data];

    }

    //数据传完之后调用此方法

    -(void)connectionDidFinishLoading:(NSURLConnection *)connection

    {

    NSString *receiveStr = [[NSString alloc]initWithData:self.receiveData encoding:NSUTF8StringEncoding];

    NSLog(@"%@",receiveStr);

    }

    //网络请求过程中,出现任何错误(断网,连接超时等)会进入此方法

    -(void)connection:(NSURLConnection *)connection

    didFailWithError:(NSError *)error

    {

    NSLog(@"%@",[error localizedDescription]);

    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 = [NSURLURLWithString:urlString];//初始化请求方式,默认为GETNSURLRequest*request = [NSURLRequestrequestWithURL:url];NSError*error;//    创建同步连接,request:请求对象,里边承载着我们的请求信息,有网址,请求头等信息。response:请求的返回(响应),里面包含了响应头的一些信息,如果需要响应头,需要传递此参数,一般不需要。error:请求出错的时候,会有错误信息保存在该参数中,一般置为nil,可以根据返回数据来判断是否请求有问题NSData*receiveData = [NSURLConnectionsendSynchronousRequest:request returningResponse:nilerror:&error];    [selfjsonParserWithData: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=213NSURL*url = [NSURLURLWithString: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请求,就得使用它的子类NSMutableURLRequestNSMutableURLRequest*mutableReq = [NSMutableURLRequestrequestWithURL:url];//设置请求方式mutableReq.HTTPMethod=@"POST";//设置请求参数mutableReq.HTTPBody= postParameterData;//建立同步连接NSData*receiveData = [NSURLConnectionsendSynchronousRequest:mutableReq returningResponse:nilerror:nil];    [selfjsonParserWithData:receiveData];}

    POST异步 实现方式block

    - (void)postAndAsynchronousMethod{NSURL*url = [NSURLURLWithString:@"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx"];NSData*postData = [[NSStringstringWithFormat:@"date=20151031&startRecord=1&len=5&udid=1234567890&terminalType=Iphone&cid=213"] dataUsingEncoding:NSUTF8StringEncoding];NSMutableURLRequest*request = [NSMutableURLRequestrequestWithURL:url];//设置请求方式request.HTTPMethod=@"POST";//设置请求参数request.HTTPBody= postData;    [NSURLConnectionsendAsynchronousRequest:request queue:[NSOperationQueuemainQueue] completionHandler:^(NSURLResponse* _Nullable response,NSData* _Nullable data,NSError* _Nullable connectionError) {        [selfjsonParserWithData:data];    }];NSLog(@"123456");}

    GET异步 实现方式block

    - (void)getAndAsynchronousMethod{NSURL*url = [NSURLURLWithString:@"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 = [NSURLRequestrequestWithURL:url];//异步连接,block实现//queue:需要将请求连接放到一个队列中,目前,我们是将该请求放到主队列中,在主队列中操作所占有的资源的优先等级高//completionHandler:请求有返回结果时,会执行该block回调//block中的参数:response:请求返回的响应,内部包含响应头。data:是我们所需要的实际数据。connectionError:请求出错时返回的错误信息[NSURLConnectionsendAsynchronousRequest:request queue:[NSOperationQueuemainQueue] completionHandler:^(NSURLResponse* _Nullable response,NSData* _Nullable data,NSError* _Nullable connectionError) {        [selfjsonParserWithData:data];    }];NSLog(@"我实在异步block底下打印");}

    文/ly渐行渐远(简书作者)

    原文链接:http://www.jianshu.com/p/dd362e41b786

    著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。

    相关文章

      网友评论

          本文标题:IOS之同步请求、异步请求、GET请求、POST请求

          本文链接:https://www.haomeiwen.com/subject/yrhcdttx.html