从本篇文章开始,介绍一些网络开发中用到的技术。
iOS的网络开发中,特别是应用开发,使用Http协议作为主要的通信手段
写代码前,先了解一些与协议相关联的内容,包括:
URL的概念
HTTP与HTTPS
HTTP请求的内容及请求对象
HTTP应答的内容及请求对象
URL
URL:统一资源标示符,可以表示一个资源的路径,这个路径可以是本地的、网络上的。
URL是对可以从互联网上得到的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址。
互联网上每一个文件都有唯一一个URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它。
NSURL是Objective-C中用于描述URL信息的对象类型,通常使用一个字符串创建
+ (instancetype)URLWithString:(NSString *)URLString
URL的编码问题
URL中不允许出现特殊编码及中文字符,如果出现需要转换为%编码形式
下面的NSString分类方法,提供对URL格式的处理。
HTTP 协议与HTTPS协议
HTTP:超文本传输协议(HyperText Transport Protocol),是互联网上广泛使用的一种网络协议。
设计的目的是为HTML页面提供发布和接受的方法,后来的发展,HTTP已经不局限于操作HTML。
目前的版本:HTTP 1.1,默认端口:80
HTTP协议,是C/S模型的标准TCP通信协议,通常服务器是网站,客户端是浏览器或者终端应用。
HTTPS:是在HTTP下加入了SSL层,用于安全的HTTP数据传输
默认端口:443
自XCode7开始,项目发送的网络请求必须发送HTTPS请求,要允许发送HTTP请求,需要:
在Info.plist文件中,添加NSAppTransportSecurity字段,类型为NSDictionary
字典中再添加NSAllowsArbitraryLoads字段,类型为Boolean,值为YES
HTTP请求的内容
如下:这是一个 http://www.baidu.com/请求的抓包数据
包含三部分:请求行、请求头、请求体
请求行:包含了请求类型、URL 、协议版本等信息
请求头:作为请求的参数,以 “字段名”:“字段值”
可以指定多个参数,其中Host字段是必须的
请求体:http的数据主体
通常对于Web浏览器而言,请求体是表单编码数据
通常对于移动端应用而言,请求体是XML或JSON格式的数据
Http请求类型
GET:获取内容,数据按照variable=value形式添加到URL的后面。
传输的数据在URL中不安全,传输的数据量受URL的长度限制。
POST:添加内容,将数据放在数据体中,数据对用户不可见
可以传输大量的数据,可以用来上传文件。
HEAD:请求首部,通常用于检查服务器最近内容的变化
PUT:发送请求(和POST类似),请求的URL存在则修改该旧版本,不存在则创建。
DELETE:请求删除资源,某些云服务上能用到。
其他请求:OPTIONS、TRACE
请求对象NSURLRequest
NSURLRequest是请求对象类型,请求对象通常由一个URL创建
+ (instancetype)requestWithURL:(NSURL *)theURL
+ (instancetype)requestWithURL:(NSURL *)theURL cachePolicy:(NSURLRequestCachePolicy)cachePolicy timeoutInterval:(NSTimeInterval)timeoutInterval
第二个方法,可以指定:
1)请求的缓存策略(后面介绍)
2)请求时的超时时间防止请求无限等待
NSURLRequest对象的属性:
//URL属性
@property(readonly, copy) NSURL *URL
//Http请求类型:(默认是GET请求)
@property(readonly, copy) NSString *HTTPMethod
//Http请求体:
@property(readonly, copy) NSData *HTTPBody
//Http请求头:
@property(readonly, copy) NSDictionary *allHTTPHeaderFields
- (NSString *)valueForHTTPHeaderField:(NSString *)field
NSMutableURLRequest 可变请求对象
NSURLRequest是一个不可变类型,其子类NSMutableURLRequest可变类型
修改请求头、请求体通常需要使用这个可变类型
@property(copy) NSString *HTTPMethod
- (void)setValue:(NSString *)value forHTTPHeaderField:(NSString *)field
- (void)addValue:(NSString *)value forHTTPHeaderField:(NSString *)field
请求的参数
通常请求的参数可以放在:
请求头
URL(GET请求)
请求体(POST请求)
如下面这个GET请求(药品搜索)
接口地址 :http://apis.baidu.com/tngou/drug/search
请求方法 :GET
请求参数(header) :
请求参数(urlParam) :
1)请求头(header参数)
通常放置非常重要或者涉及安全的参数,如上面例子中的apikey通常是一个字符串描述一个应用ID
2)URL(GET请求)
对于GET请求,通常将一些参数直接放在URL中,参数的形式如下:
http://localhost/login.php?username=aaa&password=123
蓝色表示的是资源路径
红色的两个符号,?表示后面是urlParam,&是多个参数的分割
粉色的是参数,以key=value形式指定
3)请求体(POST请求)
对于POST请求,通常将参数放在请求体中,这样做的好处是:参数不会被暴漏在URL当中
参数格式通常是:
1)上面描述的格式如:username=aaa&password=123
2)JSON 3)XML ...
最多的情况就是1),如:
HTTP应答(响应)的内容
如下,是一个请求的应答报文的抓包数据
应答报文包括三部分:状态行、消息报头、应答数据
状态行:状态码描述应答状态
消息报头:和请求头类似,可以包含一系列字段,如响应的数据类型MIME type、数据长度等
响应数据:http的数据主体
对于Web浏览器通常是表单码数据;
对于移动端应用通常是JSON/XML数据
Http应答状态码
状态码由3位数字组成,第一个数字表示类型:
1xx:请求已接收,继续处理
2xx:成功
3xx:请求重定向
4xx:客户端错误,请求不能被服务器处理
5xx:服务器错误,服务器未能处理请求
常见的状态码:
200:OK,客户端请求成功
400:Bad Request,客户端的请求有语法错误
401:Unauthorized,未经授权的
403:Forbidden,服务器接受请求,但拒绝提供服务
404:Not Found,请求的资源不存在,URL错误
503:Server Unavailable,服务器当前不能处理请求
MIME type
Http应答的消息报头包含一个Content-type字段,表示应答中的数据类型
使用MIME(Multipurpose Internet Mail Extension) 多用途互联网邮件扩展
是一个互联网标准,最早应用于电子邮件,后来被应用到浏览器及终端引用程序
服务器通过该类型,告诉浏览器或终端应用程序发送的是什么类型的数据。
MIME类型包括:视频、图像、文本、音频、应用程序等等,如:
对于移动端开发,常用的:text/html text/plain text/json application/json ...
应答的数据
一个网络请求,通常可以获得三个数据:
应答对象(NSHTTPURLResponse)
错误码(NSError,如果出错的话)
响应数据(NSData)
通常为JSON/XML
HTTP响应对象
NSURLResponse是应答报文类型,在移动端开发时,通常是由框架的方法返回
其常用属性有:
@property(readonly) long long expectedContentLength @property(readonly, copy) NSString *suggestedFilename @property(readonly, copy) NSString *MIMEType
通常我们使用的是NSURLResponse的子类NSHTTPURLResponse,表示一个Http应答报文类型
//消息报头 @property(readonly, copy) NSDictionary *allHeaderFields //状态码: @property(readonly) NSInteger statusCode + (NSString *)localizedStringForStatusCode:(NSInteger)statusCode