0.11 配置Apache 服务器
为什么要学习网络编程?
在
移动互联网时代
,移动应用的特征有:几乎所有应用都需要网络,比如QQ、微博、网易新闻、优酷、百度地图
只有通过网络跟外界进行
数据交互
、数据更新
,应用才能保持新鲜与活力如果没有了网络,也就缺少了数据变化,无论外观多么华丽,终将变成一潭死水
学习网络编程:
可以掌握实时更新数据的手段
是开发优秀应用的前提和基础
基本概念
客户端(Client)
:移动应用(iOS、android等应用)服务器(Server)
:为客户端提供服务、提供数据、提供资源的机器请求(Request)
:客户端向服务器索取数据的一种行为响应(Response)
:服务器对客户端的请求做出的反应,一般指返回数据给客户端
作为移动开发工程师,主要的精力都是放在
前端
开发
服务器
按照软件开发阶段来分,服务器可以大致分为2种
远程服务器
别名:外网服务器、正式服务器
使用阶段:应用上线后使用的服务器
使用人群:供全体用户使用
速度:取决于服务器的性能、用户的网速
本地服务器
别名:内网服务器、测试服务器
使用阶段:应用处于开发、测试阶段使用的服务器
使用人群:仅供公司内部的开发人员、测试人员使用
速度:由于是局域网,所以速度飞快,有助于提高开发测试效率
本地服务器
在工作中,会有专门的后端人员开发服务器程序,不由得你选择
在学习阶段,选择什么本地服务器都可以,能用就行
0.12 HTTP
URL
URL
的全称是Uniform Resource Locator
(统一资源定位符)通过 1 个 URL,能找到互联网上唯一的 1 个资源
URL就是资源的地址、位置,互联网上的每个资源都有一个唯一的
URL
URL 格式
基本格式:
协议头://主机地址/路径
协议头
:不同的协议,表示不同的资源查找及传输方式主机地址
:存放资源主机的IP
地址(域名)路径
:资源在主机中的具体位置
HTTP 协议
HTTP
的全称是Hypertext Transfer Protocol
,超文本传输协议规定客户端和服务器之间的数据传输格式
让客户端和服务器能有效地进行数据沟通
HTTP
协议是网络编程使用最为广泛的协议HTTP协议特点
简单快速
因为HTTP协议简单,所以
HTTP
服务器的程序规模小,通信速度快
灵活
HTTP 允许传输任意类型的数据
HTTP 0.9
和1.0
使用非持续连接限制每次连接只处理一个请求,服务器对客户端的请求做出响应后,立刻断开连接,这种方式可以节省传输时间
HTTP 1.1
使用持续连接不必为每个web对象创建一个新的连接,一个连接可以传送多个对象
HTTP通信过程
请求
HTTP
协议规定:一个完整的由客户端发给服务器
的HTTP 请求
需要包含以下内容:请求头
中至少包含以下信息# 客户端要访问的服务器主机地址Host: m.baidu.com
请求头
中还可以包含以下信息# 客户端的类型,客户端的软件环境User-Agent: iPhone AppleWebKit# 客户端所能接收的数据类型Accept: text/html, */*# 客户端的语言环境Accept-Language: zh-cn# 客户端支持的数据压缩格式Accept-Encoding: gzip# 访问结束后,是否断开连接Connection: Close
请求行
:指定请求方法
、请求资源路径
以及HTTP协议版本
# / 表示访问根目录GET / HTTP/1.1
请求头
:对客户端的环境描述、客户端请求的主机地址等信息请求体(可选):客户端发给服务器的具体数据,例如要上传的文件数据
请求格式
每一项请求信息末尾使用
\r\n
最后一个请求项末尾使用
\r\n\r\n
表示请求结束
响应
HTTP
协议规定:一个完整的HTTP 响应
包含以下内容:状态行:包含了HTTP协议版本、状态码、状态英文名称
# 请求成功HTTP/1.1 200 OK# 内容无变化HTTP/1.1 304 Not Modified
响应头:包含了对服务器的描述、对返回数据的描述
# 服务器的类型Server: Apache/2.4.10 (Unix) PHP/5.5.20# 返回数据的类型Content-Type: text/html# 返回数据的长度Content-Length: 660# 响应时间Date: Thu, 04 Jun 2015 19:31:50 GMT# ETag(HASH值,用于检测本地资源和服务器资源是否一致)ETag: "294-4e1862f57e7c0"
实体内容:服务器返回给客户端的具体二进制数据
0.13 开发方案
在iOS中,常见的发送HTTP请求的方案包括:
苹果官方
名称 | 说明 |
---|---|
NSURLConnection | iOS 2.0 推出,用法简单,最古老最经典最直接的一种方案 |
NSURLSession | iOS 7 推出,功能比 NSURLConnection 更加强大 |
CFNetwork | NSURL 的底层,纯C语言,几乎不用 |
第三方框架
名称 | 底层 | 说明 |
---|---|---|
ASIHttpRequest | CFNetwork | 外号HTTP终结者 ,功能极其强大,2012年 10 月停止更新,MRC |
AFNetworking | NSURLConnection &NSURLSession | 简单易用,提供了基本够用的常用功能,维护和使用者多 |
MKNetworkKit | NSURLConnection | 简单易用,产自三哥的故乡印度,维护和使用者少 |
Alamofire | NSURLSession | MATTT 的又一力作,Swift 开发,轻量级的 HTTP 解决方案,目前功能还远不如 AFNetworking |
0.14 NSURLConnection
步骤
NSURL
:确定要访问的资源NSURLRequest
:根据URL
建立请求,向服务器索要数据NSURLConnection
:建立网络连接,将请求(异步)发送给服务器
示例代码
// 1. `NSURL`:确定要访问的资源NSURL *url = [NSURL URLWithString:@"http://m.baidu.com"];// 2. `NSURLRequest`:根据 `URL` 建立请求,向服务器索要数据NSURLRequest *request = [NSURLRequest requestWithURL:url];// 3. `NSURLConnection`:建立网络连接,将请求(异步)发送给服务器[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { NSLog(@"%@", data);
}];
NSURLConnection
代码小结
sendAsynchronousRequest
发送异步请求
此方法就是异步执行的,程序员无序考虑开启线程,或者创建队列
会将之前建立好的请求
异步
发送给服务器等到接收到服务器响应后,由
queue
负责调度completionHandler
的执行
队列
调度
completionHandler
执行的队列[[NSOperationQueue alloc] init]
,后台线程异步执行[NSOperationQueue mainQueue]
,主线程异步执行
队列的选择
如果要对数据进行耗时处理,例如:解压缩等,选择新建队列调度
如果只是做简单处理,立即更新 UI,选择主队列
completionHandler
网络访问已经结束,接收到服务器响应数据后的回调方法
response
,服务器的响应,通常在开发下载
功能时才会使用
响应属性 | 说明 |
---|---|
URL | 服务器反馈的 URL,有的时候,服务器会重定向新的 URL |
MIMEType |
|
statusCode | 状态码
|
expectedContentLength | 数据长度,下载文件总长度 |
suggestedFilename | 建议的文件名 |
data
服务器返回的二进制数据,程序员最关心的内容connectionError
连接错误,任何网络访问都有可能出现错误
// 标准的错误处理方法if (connectionError || data == nil) { NSLog(@"网络不给力!"); return;
}
请求
基于
URL
建立请求设置请求属性:
缓存策略
,网络超时时长
告诉服务器额外信息:
客户端类型
,身份验证
...
// 告诉服务器,客户端的类型是 iPhone,而且支持 AppleWebKit[request setValue:@"iPhone AppleWebKit" forHTTPHeaderField:@"User-Agent"];
缓存策略
枚举 | 数值 | 说明 |
---|---|---|
NSURLRequestUseProtocolCachePolicy | 0 | 默认的缓存策略 |
NSURLRequestReloadIgnoringLocalCacheData | 1 |
|
NSURLRequestReturnCacheDataElseLoad | 2 | 如果有缓存,就返回缓存,否则加载数据 |
NSURLRequestReturnCacheDataDontLoad | 3 | 如果有缓存,就返回缓存,否则不加载 |
超时时长
默认网络时长是
60 s
建议超时时长
15~30
秒之间注意超时时长不能太短
SDWebImage
的默认超时时长是15
秒AFN
的默认超时时长是60
秒