文章目录
  1. 1. HTTP通信过程
    1. 1.1. 请求
      1. 1.1.1. 请求行
      2. 1.1.2. 请求头
      3. 1.1.3. 请求体
      4. 1.1.4. 创建GET请求
      5. 1.1.5. 创建POST请求
    2. 1.2. 响应
      1. 1.2.1. 状态行
      2. 1.2.2. 响应头
      3. 1.2.3. 实体内容
  2. 2. HTTP请求方案
    1. 2.1. 苹果原生(自带)
      1. 2.1.1. NSURLConnection
        1. 2.1.1.1. NSURL
        2. 2.1.1.2. NSURLRequest
        3. 2.1.1.3. NSMutableURLRequest
        4. 2.1.1.4. NSURLConnection的使用步骤
          1. 2.1.1.4.1. 同步请求
          2. 2.1.1.4.2. 异步请求
          3. 2.1.1.4.3. NSURLConnectionDataDelegate协议中的代理方法
      2. 2.1.2. NSURLSession
      3. 2.1.3. CFNetwork
    2. 2.2. 第三方框架
      1. 2.2.1. ASIHttpRequest
      2. 2.2.2. AFNetworking
      3. 2.2.3. MKNetworkKit
  3. 3. JSON
    1. 3.1. JSON解析方案
      1. 3.1.1. NSJSONSerialization的常见方法
  4. 4. XML
    1. 4.1. XML语法
      1. 4.1.1. 文档声明
      2. 4.1.2. 元素(Element)
      3. 4.1.3. 属性(Attribute)
    2. 4.2. XML解析
      1. 4.2.1. 苹果原生
      2. 4.2.2. 第三方框架
  5. 5. 推荐阅读

HTTP通信过程

请求

HTTP协议规定,一个完整的由 客户端 发给 服务器 的HTTP请求中包含以下内容。

请求行

包含了 请求方法请求资源路径HTTP协议版本,如下所示:

1
GET /ZLServer/resources/images/1.jpg HTTP/1.1

请求头

包含了对客户端的环境描述客户端请求的主机地址等信息,如下所示:

1
2
3
4
5
6
Host: 192.168.1.105:8080 	// 客户端想访问的服务器主机地址
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9) Firefox/30.0
// 客户端的类型,客户端的软件环境
Accept: text/html, */* // 客户端所能接收的数据类型
Accept-Language: zh-cn // 客户端的语言环境
Accept-Encoding: gzip // 客户端支持的数据压缩格式

请求体

客户端发给服务器的具体数据,比如文件数据。

创建GET请求

1
2
3
NSString *urlStr = [@"http://192.168.1.102:8080/MJServer/login?username=123&pwd=123" stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSURL *url = [NSURL URLWithString:urlStr];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

创建POST请求

1
2
3
4
5
6
7
NSString *urlStr = @"http://192.168.1.102:8080/MJServer/login";
NSURL *url = [NSURL URLWithString:urlStr];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
request.HTTPMethod = @"POST";
// 请求体
NSString *bodyStr = @"username=123&pwd=123";
request.HTTPBody = [bodyStr dataUsingEncoding:NSUTF8StringEncoding];

响应

客户端服务器 发送请求,服务器 应当做出响应,即返回数据给 客户端

HTTP协议规定,一个完整的HTTP响应中包含以下内容:

状态行

包含了HTTP协议版本状态码状态英文名称,如下所示:

1
HTTP/1.1 200 OK

响应头

包含了对服务器的描述对返回数据的描述,如下所示:

1
2
3
4
Server: Apache-Coyote/1.1 		    // 服务器的类型
Content-Type: image/jpeg // 返回数据的类型
Content-Length: 56811 // 返回数据的长度
Date: Mon, 23 Jun 2014 12:54:52 GMT // 响应的时间

实体内容

服务器 返回给 客户端 的具体数据,比如文件数据。

HTTP请求方案

在iOS中,常见的发送HTTP请求方案有苹果原生和第三方框架。

苹果原生(自带)

NSURLConnection

用法简单,最古老最经典最直接的一种方案。

负责发送请求,建立客户端和服务器的连接。发送NSURLRequest到数据给服务器,并收集来自服务器的响应数据。

NSURL

请求地址。

NSURLRequest

一个NSURLRequest对象就代表一个请求,它包含的信息有:

一个NSURL对象
请求方法、请求头、请求体
请求超时
... ...

NSMutableURLRequest

NSURLRequest的子类。

常用方法

1
2
3
4
5
6
7
8
9
10
11
设置请求超时等待时间(超过这个时间就算超时,请求失败)
- (void)setTimeoutInterval:(NSTimeInterval)seconds;

设置请求方法(比如GETPOST
- (void)setHTTPMethod:(NSString *)method;

设置请求体
- (void)setHTTPBody:(NSData *)data;

设置请求头
- (void)setValue:(NSString *)value forHTTPHeaderField:(NSString *)field;

NSURLConnection的使用步骤

使用NSURLConnection发送请求到步骤很简单,创建一个NSURL对象,设置请求路径;传入NSURL创建一个NSURLRequest对象,设置请求头和请求体;使用NSURLConnection发送NSURLRequest。

NSURLConnection常见的发送请求方法有以下几种:

同步请求
1
+ (NSData *)sendSynchronousRequest:(NSURLRequest *)request returningResponse:(NSURLResponse **)response error:(NSError **)error;
异步请求

根据对服务器返回数据的处理方式掉不同,又可以分为2种:

block回调

1
+ (void)sendAsynchronousRequest:(NSURLRequest*) request queue:(NSOperationQueue*) queue completionHandler:(void (^)(NSURLResponse* response, NSData* data, NSError* connectionError)) handler;

代理

1
2
3
4
- (id)initWithRequest:(NSURLRequest *)request delegate:(id)delegate;
+ (NSURLConnection*)connectionWithRequest:(NSURLRequest *)request delegate:(id)delegate;
- (id)initWithRequest:(NSURLRequest *)request delegate:(id)delegate startImmediately:(BOOL)startImmediately;//在startImmediately = NO的情况下,需要调用start方法开始发送请求
- (void)start;
成为NSURLConnection的代理,最好遵守NSURLConnectionDataDelegate协议
NSURLConnectionDataDelegate协议中的代理方法
1
2
3
4
5
6
7
8
9
10
11
开始接收到服务器的响应时调用
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response;

接收到服务器返回的数据时调用(服务器返回的数据比较大时会调用多次)
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data;

服务器返回的数据完全接收完毕后调用
- (void)connectionDidFinishLoading:(NSURLConnection *)connection;

请求出错时调用(比如请求超时)
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error;

NSURLSession

iOS7新出的技术,功能比NSURLConnection更加强大。

CFNetwork

NSURLConnection和NSURLSession的底层,纯C语言。

第三方框架

ASIHttpRequest

外号“HTTP终结者”,功能极其强大,可惜早已停止更新。

AFNetworking

简单易用,提供了基本够用的常用功能,维护和使用者多。

MKNetworkKit

简单易用,维护和使用者少。

JSON

JSON是一种轻量级的数据格式,一般用于数据交互。服务器返回给客户端的数据,一般都是JSON格式或者XML格式(文件下载除外)。

JSON解析方案

在iOS中,JSON的常见解析方案有4种

第三方框架:JSONKitSBJsonTouchJSON(性能从左到右越差)

苹果原生(自带):NSJSONSerialization(性能最好)

NSJSONSerialization的常见方法

JSON数据 –> OC对象

1
+ (id)JSONObjectWithData:(NSData *)data options:(NSJSONReadingOptions)opt error:(NSError **)error;

OC对象 –> JSON数据

1
+ (NSData *)dataWithJSONObject:(id)obj options:(NSJSONWritingOptions)opt error:(NSError **)error;

XML

全称是Extensible Markup Language,译作“可扩展标记语言”,跟JSON一样,也是常用的一种用于交互的数据格式,一般也叫XML文档(XML Document)。

XML语法

一个常见的XML文档一般由文档声明元素(Element)属性(Attribute)三部分组成。

文档声明

在XML文档的最前面,必须编写一个文档声明,用来声明XML文档的类型。

最简单的声明

1
<?xml version="1.0" ?>

用encoding属性说明文档的字符编码

1
<?xml version="1.0" encoding="UTF-8" ?>

元素(Element)

一个元素包括了开始标签和结束标签,规范的XML文档最多只有1个根元素,其他元素都是根元素的子孙元素。

XML中的所有空格和换行,都会当做具体内容处理。

属性(Attribute)

一个元素可以拥有多个属性,属性值必须用 双引号”” 或者 单引号’’ 括住。

实际上,属性表示的信息也可以用子元素来表示。

XML解析

XML的解析方式有2种:

DOM:一次性将整个XML文档加载进内存,比较适合解析小文件
SAX:从根元素开始,按顺序一个元素一个元素往下解析,比较适合解析大文件

在iOS中,解析XML的手段有很多种。

苹果原生

NSXMLParse:SAX方式解析,使用简单。

NSXMLParser采取的是SAX方式解析,特点是事件驱动,下面情况都会通知代理

当扫描到文档(Document)的开始与结束
当扫描到元素(Element)的开始与结束
1
2
3
4
5
6
7
使用步骤
// 传入XML数据,创建解析器
NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];
// 设置代理,监听解析过程
parser.delegate = self;
// 开始解析
[parser parse];

NSXMLParserDelegate

1
2
3
4
5
6
7
8
9
10
11
当扫描到文档的开始时调用(开始解析)
- (void)parserDidStartDocument:(NSXMLParser *)parser

当扫描到文档的结束时调用(解析完毕)
- (void)parserDidEndDocument:(NSXMLParser *)parser

当扫描到元素的开始时调用(attributeDict存放着元素的属性)
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict

当扫描到元素的结束时调用
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName

第三方框架

libxml2:纯C语言,默认包含在iOS SDK中,同时支持DOM和SAX方式解析

GDataXML:DOM方式解析,由Google开发,基于libxml2

GDataXML中常用的类

GDataXMLDocument:代表整个XML文档
GDataXMLElement:代表文档中的每个元素
使用attributeForName:方法可以获得属性值

XML解析方式的选择建议

大文件:NSXMLParser、libxml2
小文件:GDataXML

推荐阅读

从 NSURLConnection 到 NSURLSession

使用AFNetworking, SDWebimage和OHHTTPStubs

文章目录
  1. 1. HTTP通信过程
    1. 1.1. 请求
      1. 1.1.1. 请求行
      2. 1.1.2. 请求头
      3. 1.1.3. 请求体
      4. 1.1.4. 创建GET请求
      5. 1.1.5. 创建POST请求
    2. 1.2. 响应
      1. 1.2.1. 状态行
      2. 1.2.2. 响应头
      3. 1.2.3. 实体内容
  2. 2. HTTP请求方案
    1. 2.1. 苹果原生(自带)
      1. 2.1.1. NSURLConnection
        1. 2.1.1.1. NSURL
        2. 2.1.1.2. NSURLRequest
        3. 2.1.1.3. NSMutableURLRequest
        4. 2.1.1.4. NSURLConnection的使用步骤
          1. 2.1.1.4.1. 同步请求
          2. 2.1.1.4.2. 异步请求
          3. 2.1.1.4.3. NSURLConnectionDataDelegate协议中的代理方法
      2. 2.1.2. NSURLSession
      3. 2.1.3. CFNetwork
    2. 2.2. 第三方框架
      1. 2.2.1. ASIHttpRequest
      2. 2.2.2. AFNetworking
      3. 2.2.3. MKNetworkKit
  3. 3. JSON
    1. 3.1. JSON解析方案
      1. 3.1.1. NSJSONSerialization的常见方法
  4. 4. XML
    1. 4.1. XML语法
      1. 4.1.1. 文档声明
      2. 4.1.2. 元素(Element)
      3. 4.1.3. 属性(Attribute)
    2. 4.2. XML解析
      1. 4.2.1. 苹果原生
      2. 4.2.2. 第三方框架
  5. 5. 推荐阅读