iOS:网络编程中三个数据解析协议HTTP、XML、JSON的详细介绍

简介:

网络编程:HTTP协议、XML数据协议、JSON数据协议:

HTTP:
1、HTTP传输数据有四种方式:Get方式、Post方式、同步请求方式、异步请求方式。
说明:同步和异步请求方式在创建链接对象和创建请求对象时,用Get方式或Post方式中的任意一种即可;那么,同步/异步请求方式和Get/Post方式不同的地方是什么呢?区别在于进行连接处理这一步上,Get/Post方式它们均使用相同代理NSURLConnectionDataDelegate的方法传输数据,而同步/异步请求方式则不需要使用代理。
 
 
2、实现步骤:
•第一步:确定地址——URL   •NSURL(地址)
•第二步:建立请求    •NSURLRequest(请求,GET请求使用)/•NSMutableURLRequest(可变请求,POST请求使用)
•第三步:开始连接    •NSURLConnection(连接)

   等待网络处理中……

•第四步:连接完成,处理结果
 
 
3、<NSURLConnectionDataDelegate>方法,Get和Post方式发送数据时,连接过程中使用代理,之所以使用代理,是因为要处理请求返回的结果!

// 服务器开始返回数据

-(void)connection:didReceiveResponse:

// 收到服务器返回的数据,本方法会被调用多次

- (void)connection:didReceiveData:

// 数据接收完毕,做数据的最后处理

-(void)connectionDidFinishLoading:

// 网络连接错误

- (void)connection:didFailWithError:

// 发送数据给服务器,POST 请求使用此方法

- (void)connection:didSendBodyData:totalBytesWritten: totalBytesExpectedToWrite:

unsigned long enconding = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000)

 

4、GET请求步骤——1. 地址 2.请求 3.连接 4.启动

(1)定义URL:

•NSString *urlStr = @"http://127.0.0.1/login.php?username=admin&password=123";
•NSURL *url = [NSURL URLWithString:[urlStr   
       stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
 
(2)定义Reauest:
•NSURLRequest *request = [NSURLRequest requestWithURL:url];
 
(3)定义Connection:
•NSURLConnection *conn = [[NSURLConnection alloc]initWithRequest:request delegate:self];
 
(4)启动Connection:
•[conn start];
 
 
5、POST请求步骤——1. 地址 2.请求 3.连接 4.启动
(1)定义URL
•NSString *urlStr = @"http://xxx.com/login.php”;
 
(2)定义Request:
•NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
•// 等待服务器响应的最长时间
•[request setTimeoutInterval:5.0];
•// 设置请求方法,大小写无关
•[request setHTTPMethod:@"post"];
•NSString *bodyString = [NSString stringWithFormat:@"username=%@&password=%@",_userNameText.text,_passwordText.text];
•// 生成请求体数据并编码
•NSData *body = [bodyString dataUsingEncoding:NSUTF8StringEncoding];
•// 设置HTTP请求数据体
•[request setHTTPBody:body];
 
(3)定义Connection:
•NSURLConnection *conn = [[NSURLConnection alloc]initWithRequest:request delegate:self];
 
(4)启动Connection:
•[conn start];
 
 
6、同步请求和异步请求(前两步和Get或Post相同): 1. 地址 2.请求 3.使用同步/异步请求
•NSURLConnection提供了两个静态方法可以直接同步或异步调用NSURLRequest,而无需通过NSURLConnectionDataDelegate获取数据
•同步请求:

sendSynchronousRequest:request returningResponse:&response error:&error

•异步请求:

sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error)

•服务器传输回来的数据,设置要用的编码类型,将汉字GBK编码转为国际通用编码UTF-8编码:

unsigned long encoding = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000);

 

 ※知识拓展:

从 GBK 转到 UTF-8   (上面的例子可作为一个成功案例)
用 NSStringEncoding enc = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000) ,然后就可以用initWithData:encoding来实现。
从 UTF-8 转到 GBK
CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000),得到的enc却是kCFStringEncodingInvalidId。
没关系,试试 NSData *data=[nsstring dataUsingEncoding:-2147482063];

注意:必须使用kCFStringEncodingGB_18030_2000这个字符集,那个kCFStringEncodingGB_2312_80试了也不行。
成功案例: 将uif-8格式(xcode默认的)的字符串str_selectedLeiXing 转换为GBK格式的strGBK,如下所示:

    NSData *data = [str_selectedLeiXing dataUsingEncoding:-2147482063];

    NSString *strGBK = [[NSString alloc]initWithData:data encoding:-2147482063];

    以上代码的实现,不需要添加任何附加开发包。

 

XML:

1、介绍:

可扩展标记语言 

 用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言

易读性高,编码手写难度小,数据量大
 
2、两种解析方式:
(1)NSXMLParser是SAX方法解析
SAX(Simple API for XML)
只能读,不能修改,只能顺序访问,适合解析大型XML,解析速度快
常应用于处理大量数据的XML,实现异构系统的数据访问,实现跨平台
从文档的开始通过每一节点移动,定位一个特定的节点
 
(2)DOM(Document Object Model)
不仅能读,还能修改,而且能够实现随机访问,缺点是解析速度慢,适合解析小型文档
一般应用与小型的配置XML,方便操作
为载入到内存的文档节点建立类型描述,呈现可横向移动、潜在巨大的树型结构
在内存中生成节点树操作代价昂贵
 
3、NSXMLParser解析过程:
<1>. 创建NSXMLParser实例,并传入从服务器接收的XML数据
<2>. 定义解析器代理
<3>. 解析器解析
<4.. 通过解析代理方法完成XML数据的解析
 

4、NSXMLParser解析的NSXMLParserDelegate协议代理方法:

// 1. 开始解析某个元素,会遍历整个XML,识别元素节点名称

- (void)parser:didStartElement:namespaceURI:qualifiedName:attributes:

// 2. 文本节点,得到文本节点里存储的信息数据,对于大数据可能会接收多次!为了节约内存开销

- (void)parser:foundCharacters:

// 3. 结束某个节点,存储从parser:foundCharacters:方法中获取到的信息

- (void)parser:didEndElement:namespaceURI:qualifiedName:

注意:在解析过程中,上述三个方法会不停的重复执行,直到遍历完成为止

// 4. 开始解析XML文档

- (void)parserDidStartDocument:

// 5. 解析XML文档结束

- (void)parserDidEndDocument:

// 6. 解析出错

- (void)parser:parseErrorOccurred:

 

 
 

JSON:

1、介绍:

作为一种轻量级的数据交换格式,正在逐步取代XML,成为网络数据的通用格式

基于JavaScript的一个子集
易读性略差,编码手写难度大,数据量小
JSON格式取代了XML给网络传输带来了很大的便利,但是却没有了XML的一目了然,尤其是JSON数据很长的时候,我们会陷入繁琐复杂的数据节点查找中
 
2、解析方式:
 
作为一种轻量级的数据交换格式,JSON正在逐步取代XML,成为网络数据的通用格式
从iOS 5开始,使用NSJSONSerialization对JSON解析
 
其他常见的三种JSON解析第三方库:
SBJson
JSONKit
TouchJson

 

从性能上来说,NSJSONSerialization最好,JSONKit其次。SBJson使用较为广泛,API简单易用
使用类方法JSONObjectWithData:options:error:可以将接收到的JSON数据反序列化为NSArray或NSDictionary等对象
 
3、步骤:
   <1>加载JSON数据

- (IBAction)loadJSONData:(id)sender

{

    // 定义URL

      NSString *urlStr = [NSString stringWithFormat:@"%@/itcast/videos.php?format=json", WEB_ROOT_URL];

    NSURL *url = [NSURL URLWithString:urlStr];

    

    // 获取网络数据

      NSData *data = [NSData dataWithContentsOfURL:url];

    

    // 反序列化JSON数据,生成NSArray

    NSArray *array = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];

    // 将JSON字典写入文件,便于调试

      NSArray *docs = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

    NSString *docDir = [docs[0]stringByAppendingPathComponent:@"jsonArray.plist"];

    [array writeToFile:docDir atomically:YES];

}

  <2>存储加载到的数据
 

// 初始化数据数组

if (_dataList == nil) {

    _dataList = [NSMutableArray array];

} else {

    [_dataList removeAllObjects];

}

// 填充数组

for (NSDictionary *dict in array) {

    Video *video = [[Video alloc]init];

    

    [video setId:[dict[@"id"]integerValue]];

    [video setName:dict[@"name"]];

    [video setLength:[dict[@"length"]integerValue]];

    [video setVideoURL:[NSString stringWithFormat:@"%@%@", WEB_ROOT_URL, dict[@"videoURL"]]];

    [video setImageURL:[NSString stringWithFormat:@"%@%@", WEB_ROOT_URL, dict[@"imageURL"]]];

    [video setDescription:dict[@"description"]];

    [video setTeacher:dict[@"teacher"]];

    

    [_dataList addObject:video];

}

// 刷新表格

 

[_videosTable reloadData];

程序猿神奇的手,每时每刻,这双手都在改变着世界的交互方式!


本文转自当天真遇到现实博客园博客,原文链接:http://www.cnblogs.com/XYQ-208910/p/4833439.html,如需转载请自行联系原作者
目录
相关文章
|
3月前
|
存储 Java 文件存储
微服务——SpringBoot使用归纳——Spring Boot使用slf4j进行日志记录—— logback.xml 配置文件解析
本文解析了 `logback.xml` 配置文件的详细内容,包括日志输出格式、存储路径、控制台输出及日志级别等关键配置。通过定义 `LOG_PATTERN` 和 `FILE_PATH`,设置日志格式与存储路径;利用 `&lt;appender&gt;` 节点配置控制台和文件输出,支持日志滚动策略(如文件大小限制和保存时长);最后通过 `&lt;logger&gt;` 和 `&lt;root&gt;` 定义日志级别与输出方式。此配置适用于精细化管理日志输出,满足不同场景需求。
251 1
|
18天前
|
网络协议 API Python
解析http.client与requests在Python中的性能比较和改进策略。
最后,需要明确的是,这两种库各有其优点和适用场景。`http.client` 更适合于基础且并行的请求,`requests` 则因其易用且强大的功能,更适用于复杂的 HTTP 场景。对于哪种更适合你的应用,可能需要你自己进行实际的测试来确定。
46 10
|
23天前
|
域名解析 网络协议 网络安全
SSL证书验证全攻略:DNS/HTTP/手动解析怎么选?
SSL证书在网络安全中至关重要,1Panel提供三种验证方式:DNS验证、HTTP验证和手动解析。DNS验证便捷,适合CDN网站;HTTP验证快速,需服务器在线;手动解析灵活,但操作复杂。根据需求选择合适确认方式,定期检查证书状态。
254 2
|
30天前
|
安全 网络协议 算法
HTTP/HTTPS与SOCKS5协议在隧道代理中的兼容性设计解析
本文系统探讨了构建企业级双协议隧道代理系统的挑战与实现。首先对比HTTP/HTTPS和SOCKS5协议特性,分析其在工作模型、连接管理和加密方式上的差异。接着提出兼容性架构设计,包括双协议接入层与统一隧道内核,通过协议识别模块和分层设计实现高效转换。关键技术部分深入解析协议转换引擎、连接管理策略及加密传输方案,并从性能优化、安全增强到典型应用场景全面展开。最后指出未来发展趋势将更高效、安全与智能。
61 1
|
2月前
|
安全 网络安全 数据安全/隐私保护
HTTP 与 HTTPS 协议及 SSL 证书解析-http和https到底有什么区别?-优雅草卓伊凡
HTTP 与 HTTPS 协议及 SSL 证书解析-http和https到底有什么区别?-优雅草卓伊凡
129 3
|
2月前
|
安全 网络安全 定位技术
网络通讯技术:HTTP POST协议用于发送本地压缩数据到服务器的方案。
总的来说,无论你是一名网络开发者,还是普通的IT工作人员,理解并掌握POST方法的运用是非常有价值的。它就像一艘快速,稳定,安全的大船,始终为我们在网络海洋中的冒险提供了可靠的支持。
101 22
|
2月前
|
存储 数据库 Python
利用Python获取网络数据的技巧
抓起你的Python魔杖,我们一起进入了网络之海,捕捉那些悠游在网络中的数据鱼,想一想不同的网络资源,是不是都像数不尽的海洋生物,我们要做的,就是像一个优秀的渔民一样,找到他们,把它们捕获,然后用他们制作出种种美味。 **1. 打开魔法之门:请求包** 要抓鱼,首先需要一个鱼网。在Python的世界里,我们就是通过所谓的“请求包”来发送“抓鱼”的请求。requests是Python中常用的发送HTTP请求的库,用它可以方便地与网络上的资源进行交互。所谓的GET,POST,DELETE,还有PUT,这些听起来像偶像歌曲一样的单词,其实就是我们鱼网的不同方式。 简单用法如下: ``` im
77 14
|
2月前
|
网络安全
网络问题解析:如何解决CondaHTTPError HTTP 000 CONNECTION FAILED错误。
以上就是斯诺普为你准备的解决Conda出现HTTP连接错误的手术室。希望这辆小车可以顺利驶出棘手的泥潭,再次在自由的大路上疾驰。一切的尝试和努力,只为更好的探索与开发。
134 17
|
2月前
|
缓存 安全 Java
深入解析HTTP请求方法:Spring Boot实战与最佳实践
这篇博客结合了HTTP规范、Spring Boot实现和实际工程经验,通过代码示例、对比表格和架构图等方式,系统性地讲解了不同HTTP方法的应用场景和最佳实践。
224 5
|
3月前
|
网络协议 物联网
VB6网络通信软件上位机开发,TCP网络通信,读写数据并处理,完整源码下载
本文介绍使用VB6开发网络通信上位机客户端程序,涵盖Winsock控件的引入与使用,包括连接服务端、发送数据(如通过`Winsock1.SendData`方法)及接收数据(利用`Winsock1_DataArrival`事件)。代码实现TCP网络通信,可读写并处理16进制数据,适用于自动化和工业控制领域。提供完整源码下载,适合学习VB6网络程序开发。 下载链接:[完整源码](http://xzios.cn:86/WJGL/DownLoadDetial?Id=20)
115 12

推荐镜像

更多
  • DNS