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
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。