网络编程: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];

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

  1. 网络编程[第三篇]基于tcp协议实现远程连接

    需要用到subprogress模块来远程控制cmd控制台程序来得到控制台的输出信息 一.服务端 —— 控制输出信息 import socket import subprocess #socket实例化 ...

  2. iOS开发——实战篇Swift篇&UItableView结合网络请求,多线程,数据解析,MVC实战

    UItableView结合网络请求,多线程,数据解析,MVC实战 学了这么久的swift都没有做过什么东西,今天就以自己的一个小小的联系,讲一下,怎么使用swift在实战中应用MVC,并且结合后面的高 ...

  3. 脑残式网络编程入门(三):HTTP协议必知必会的一些知识

    本文原作者:“竹千代”,原文由“玉刚说”写作平台提供写作赞助,原文版权归“玉刚说”微信公众号所有,即时通讯网收录时有改动. 1.前言 无论是即时通讯应用还是传统的信息系统,Http协议都是我们最常打交 ...

  4. iOS网络编程模型

    iOS网络编程层次结构也分为三层: Cocoa层:NSURL,Bonjour,Game Kit,WebKit Core Foundation层:基于 C 的 CFNetwork 和 CFNetServ ...

  5. iOS网络编程笔记——Socket编程

    一.什么是Socket通信: Socket是网络上的两个程序,通过一个双向的通信连接,实现数据的交换.这个双向连路的一端称为socket.socket通常用来实现客户方和服务方的连接.socket是T ...

  6. 网络编程中select模型和poll模型学习(linux)

    一.概述 并发的网络编程中不管是阻塞式IO还是非阻塞式IO,都不能很好的解决同时处理多个socket的问题.操作系统提供了复用IO模型:select和poll,帮助我们解决了这个问题.这两个函数都能够 ...

  7. 从socket开始讲IOS网络编程

    home list tags talk user rss Mac&iOS Socket 大纲 一.Socket简介 二.BSD Socket编程准备 1.地址 2.端口 3.网络字节序 4.半 ...

  8. ios网络编程学习

    //网络访问获取数据//定义一个UIWebView属性,用来展示数据 @property (strong, nonatomic) IBOutlet UIWebView *myWebView; //.. ...

  9. TCP/IP网络编程中socket的行为

    一. read/write的语义:为什么会阻塞? 先从write说起: #include <unistd.h>ssize_t write(int fd, const void *buf, ...

随机推荐

  1. 小甲鱼C++笔记(上)1-24

    一 OO思想:每个对象都是一个完整的独立的个体,由相关的属性和行为组合与外界分隔 OO思想的特点:1封装 把对象的属性和方法结合成一个独立的系统单位,并尽可能隐藏内部细节 2抽象 对一类公共问题进行统 ...

  2. c++ primer 6 语句

    没什么重要的东西,异常处理在17章再讲吧

  3. JS 数据类型转换以其他

    JavaScript 是一种弱类型的语言,也就是没有类型限制,变量可以随时被赋予任意值. 同时,在程序运行过程中,类型会被自动确认的.因此,这就是涉及到数据的类型转换.在 JS 的世界中,数据类型转换 ...

  4. 牛客练习赛19 C-托米航空公司

    思路:轮廓线dp,找bug找死我了. #include<bits/stdc++.h> #define LL long long #define fi first #define se se ...

  5. 2017-2018-1 20179202《Linux内核原理与分析》第五周作业

    一.系统调用实验: 1.知识准备: (1)系统调用的三层皮:xyz()(API).system_call(所有系统调用的入口) . sys_xyz()(中断服务程序) (2)API是程序员在用户空间下 ...

  6. 提起Ajax请求的方式(POST)

    前言 => 是ES6中的arrow function x=>x+6 就相当于 function(x){ return x+6; } 正文 XMLHttpRequest a=new XMLH ...

  7. angular4 动态Form中获取表单字段并在页面中使用的方法

    主要有两种方式 第一种 使用get属性 页面中使用如下: 第二种 使用普通方法事件  页面中使用如下 *转载请附出处

  8. WebApi使用JWT认证(二)

    这是第二部:实现NetCore上的WebApi使用JWT认证 1.NetCore新建一个WebApi的项目 2.打开AppSettings.json,添加Jwt的信息,这里为了演示而已 { " ...

  9. hdu 1565 最小割

    黑白染色,源指向白,黑指向汇,容量都是方格中数的大小,相邻的格子白指向黑,容量为oo,然后求一次最小割. 这个割是一个简单割,如果只选择不在割中的点,那么一种割就和一个选数方案一一对应,割的大小就是不 ...

  10. hdu 3572 资源分配

    资源分配,每个时间点有m个机器可用,要将这资源分配给n个任务中的一些,要求每个任务在自己的时间范围中被分配了p[i]个资源,建图: 建立源,与每个时间点连边,容量为m,每个任务向其对应的时间段中的每个 ...