网络开发--NSURLConnection类的简单介绍
2015-10-07 18:55
756 查看
NSURL | 请求地址 |
NSURLRequest | 封装一个请求,保存发给服务器的全部数据 |
NSMutableURLRequest | NSURLRequest的子类,提供了改变请求的属性的方法 |
NSURLConnection | 负责发送请求,建立客户端和服务器的连接。发送NSURLRequest的数据给服务器,并收集来自服务器的响应数据 |
NSURL *url = [NSURL urlWithString@"http://server.com/postme"]; NSMutableURLRequest *req = [NSMutableURLRequest requestWithURL:url]; [req setHTTPMethod:@"POST"]; [req setHTTPBody:[@"Post body" dataUsingEncoding:NSUTF8StringEncoding]];
使用NSURLConnection发送请求主要有三步:
(1)创建一个NSURL对象,设置请求路径;
(2)传入NSURL创建一个NSURLRequest对象,设置请求头和请求体;
(3)使用NSURLConnection发送NSURLRequest(发送请求)。
(整理自大神:http://www.cnblogs.com/wendingding/p/3813572.html);
同步请求 | 从因特网请求数据,一旦发送同步请求,程序将停止用户交互,直至服务器返回数据完成,才可以进行下一步操作, |
异步请求 | 不会阻塞主线程,而会建立一个新的线程来操作,用户发出异步请求后,依然可以对UI进行操作,程序可以继续运行 |
GET加载方式 | 将参数直接写在访问路径上。操作简单,不过容易被外界看到,安全性不高,地址最多255字节; |
POST加载方式 | 将参数放到body里面。POST请求操作相对复杂,需要将参数和地址分开,不过安全性高,参数放在body里面,不易被捕获。 |
//第一步,创建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];
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];
缓存协议(枚举类型)
NSURLRequestUseProtocolCachePolicy(基础策略) NSURLRequestReloadIgnoringLocalCacheData(忽略本地缓存) NSURLRequestReturnCacheDataElseLoad(首先使用缓存,如果没有本地缓存,才从原地址下载) NSURLRequestReturnCacheDataDontLoad(使用本地缓存,从不下载,如果本地没有缓存,则请求失败,此策略多用于离线操作) NSURLRequestReloadIgnoringLocalAndRemoteCacheData(无视任何缓存策略,无论是本地的还是远程的,总是从原地址重新下载) NSURLRequestReloadRevalidatingCacheData(如果本地缓存是有效的则不下载,其他任何情况都从原地址重新下载)
(整理自大神:http://my.oschina.net/sunqichao/blog/75011);
HTTP Status Code:HTTP状态码,用以表示网页服务器HTTP响应状态的3位数字代码,它由 RFC 2616 规范定义。
服务器返回数据时,NSURLConnectionDelegate的代理方法:
//当接收到服务器的响应(连通了服务器)时会调用 - (void)connection:(NSURLConnection *)theConnection didReceiveResponse:(NSURLResponse *)response{ } //当接收到服务器的数据时会调用(可能会被调用多次,每次只传递部分数据) - (void)connection:(NSURLConnection *)aConn didReceiveData:(NSData *)data { } //当服务器的数据加载完毕时就会调用 - (void)connectionDidFinishLoading:(NSURLConnection *)aConn { } //请求错误(失败)的时候调用(请求超时\断网\没有网\,一般指客户端错误) - (void)connection:(NSURLConnection *)aConn didFailWithError:(NSError *)error { }
苹果自带的NSJSONSerialization基于json的数据包封装和解析(相关第三方解析json类库有TouchJson,JSONKit,SBJon等)
封装:
NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys:@"value1",@"key1",@"value2",@"key2",@"value3",@"key3", nil]; // isValidJSONObject判断对象是否可以构建成json对象 if ([NSJSONSerialization isValidJSONObject:dic]){ NSError *error; // 创造一个json从Data, NSJSONWritingPrettyPrinted指定的JSON数据产的空白,使输出更具可读性。 NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dic options:NSJSONWritingPrettyPrinted error:&error]; NSString *json =[[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; NSLog(@"json data:%@",json); }
解析:
NSError *error; //加载一个NSURL对象 NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://m.weather.com.cn/data/101120101.html"]]; //将请求的url数据放到NSData对象中 NSData *response = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; //IOS自带解析类NSJSONSerialization从response中解析出数据放到字典中 NSDictionary *weatherDic = [NSJSONSerialization JSONObjectWithData:response options:NSJSONReadingMutableLeaves error:&error]; NSDictionary *weatherInfo = [weatherDic objectForKey:@"weatherinfo"]; NSString *text = [NSString stringWithFormat:@"今天是 %@ %@ %@ 的天气状况是:%@ %@ ",[weatherInfo objectForKey:@"date_y"],[weatherInfo objectForKey:@"week"],[weatherInfo objectForKey:@"city"], [weatherInfo objectForKey:@"weather1"], [weatherInfo objectForKey:@"temp1"]]; NSLog(@"weatherInfo:%@", text );
(整理自大神:http://blog.csdn.net/xyz_lmn/article/details/8968187);
相关文章推荐
- Java高级_网络编程
- centos Linux系统日常管理2 tcpdump,tshark,selinux,strings命令, iptables ,crontab,TCP,UDP,ICMP,FTP网络知识 第十五节课
- .net mvc 一个Action的 HttpGet 和 HttpPost
- Go 网络编程笔记
- Java学习笔记———《http的get请求和post请求及封装的工具类》
- 《TCP/IP高效编程》 ---------阅读笔记
- http://www.kongxx.info/blog/?p=59
- 深度学习(DL)与卷积神经网络(CNN)学习随笔-05-基于Python的LeNet之CNN
- Github错误:fatal: Authentication failed for 'https://github.com/ ...
- Java基础知识强化之网络编程笔记03:UDP之UDP协议发送数据 和 接收数据
- php5.5、php 5.6 $GLOBALS ["HTTP_RAW_POST_DATA"]为空
- Android如何进行网络通信(与web交互)
- 用HttpCombiner来减少js和css的请问次数
- TCP为什么需要3次握手与4次挥手
- Theano学习笔记01--Dimshuffle()函数
- Android 封装http请求的工具类
- iOS9 HTTP 不能正常使用的解决办法
- 孤儿进程组 http://blog.chinaunix.net/uid-27767798-id-3711413.html
- Java基础知识强化之网络编程笔记02:Socket通信原理图解
- 异步HttpClient框架用法