iOS网络-01.基本概念

0.11  配置Apache 服务器

为什么要学习网络编程?

  • 移动互联网时代,移动应用的特征有:

    • 几乎所有应用都需要网络,比如QQ、微博、网易新闻、优酷、百度地图

    • 只有通过网络跟外界进行数据交互数据更新,应用才能保持新鲜与活力

    • 如果没有了网络,也就缺少了数据变化,无论外观多么华丽,终将变成一潭死水

  • 学习网络编程:

    • 可以掌握实时更新数据的手段

    • 是开发优秀应用的前提和基础

基本概念

  • 客户端(Client):移动应用(iOS、android等应用)

  • 服务器(Server):为客户端提供服务、提供数据、提供资源的机器

  • 请求(Request):客户端向服务器索取数据的一种行为

  • 响应(Response):服务器对客户端的请求做出的反应,一般指返回数据给客户端

132848_MEGE_2549202.png

作为移动开发工程师,主要的精力都是放在前端开发

服务器

按照软件开发阶段来分,服务器可以大致分为2种

  • 远程服务器

    • 别名:外网服务器、正式服务器

    • 使用阶段:应用上线后使用的服务器

    • 使用人群:供全体用户使用

    • 速度:取决于服务器的性能、用户的网速

  • 本地服务器

    • 别名:内网服务器、测试服务器

    • 使用阶段:应用处于开发、测试阶段使用的服务器

    • 使用人群:仅供公司内部的开发人员、测试人员使用

    • 速度:由于是局域网,所以速度飞快,有助于提高开发测试效率

本地服务器

  • 在工作中,会有专门的后端人员开发服务器程序,不由得你选择

  • 在学习阶段,选择什么本地服务器都可以,能用就行


0.12 HTTP

URL

  • URL 的全称是 Uniform Resource Locator(统一资源定位符)

  • 通过 1 个 URL,能找到互联网上唯一的 1 个资源

  • URL就是资源的地址、位置,互联网上的每个资源都有一个唯一的 URL

URL 格式

  • 基本格式:协议头://主机地址/路径

    • 协议头:不同的协议,表示不同的资源查找及传输方式

    • 主机地址:存放资源主机的 IP 地址(域名)

    • 路径:资源在主机中的具体位置

 

HTTP 协议

  • HTTP 的全称是 Hypertext Transfer Protocol,超文本传输协议

  • 规定客户端和服务器之间的数据传输格式

  • 让客户端和服务器能有效地进行数据沟通

  • HTTP 协议是网络编程使用最为广泛的协议

    133106_t9k4_2549202.png

  • 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"
    • 实体内容:服务器返回给客户端的具体二进制数据

      133301_AGxU_2549202.png


0.13 开发方案

在iOS中,常见的发送HTTP请求的方案包括:

  • 苹果官方

名称说明
NSURLConnectioniOS 2.0 推出,用法简单,最古老最经典最直接的一种方案
NSURLSessioniOS 7 推出,功能比 NSURLConnection 更加强大
CFNetworkNSURL 的底层,纯C语言,几乎不用
  • 第三方框架

名称底层说明
ASIHttpRequestCFNetwork外号HTTP终结者,功能极其强大,2012年 10 月停止更新,MRC
AFNetworkingNSURLConnection &NSURLSession简单易用,提供了基本够用的常用功能,维护和使用者多
MKNetworkKitNSURLConnection简单易用,产自三哥的故乡印度,维护和使用者少
AlamofireNSURLSessionMATTT 的又一力作,Swift 开发,轻量级的 HTTP 解决方案,目前功能还远不如 AFNetworking


0.14 NSURLConnection

步骤

  1. NSURL:确定要访问的资源

  2. NSURLRequest:根据 URL 建立请求,向服务器索要数据

  3. 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
  • 服务器告诉客户端,返回的二进制数据的类型

  • ContentType

  • 根据 MIMEType 客户端就知道使用什么软件处理返回的二进制数据

  • 网络之所以这么丰富多彩,是因为有非常多的客户端软件

statusCode状态码
  • 1XX消息

  • 2XX 成功

  • 3XX 更多选择

  • 4XX 客户端错误

  • 5XX 服务器错误

expectedContentLength数据长度,下载文件总长度
suggestedFilename建议的文件名
  • data 服务器返回的二进制数据,程序员最关心的内容

  • connectionError 连接错误,任何网络访问都有可能出现错误

// 标准的错误处理方法if (connectionError || data == nil) {    NSLog(@"网络不给力!");    return;
}

请求

  1. 基于 URL 建立请求

  2. 设置请求属性:缓存策略网络超时时长

  3. 告诉服务器额外信息:客户端类型身份验证...

// 告诉服务器,客户端的类型是 iPhone,而且支持 AppleWebKit[request setValue:@"iPhone AppleWebKit" forHTTPHeaderField:@"User-Agent"];
缓存策略
枚举数值说明
NSURLRequestUseProtocolCachePolicy0默认的缓存策略
NSURLRequestReloadIgnoringLocalCacheData1
  • 忽略本地缓存数据,始终加载服务器的数据

  • 对数据的及时性要求高的应用

  • 例如:彩票、股票等

NSURLRequestReturnCacheDataElseLoad2如果有缓存,就返回缓存,否则加载数据
NSURLRequestReturnCacheDataDontLoad3如果有缓存,就返回缓存,否则不加载
超时时长
  • 默认网络时长是 60 s

  • 建议超时时长 15~30 秒之间

  • 注意超时时长不能太短

  • SDWebImage 的默认超时时长是 15 秒

  • AFN 的默认超时时长是 60 秒

转载于:https://my.oschina.net/u/2549202/blog/541979

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值