本文为菜鸟窝作者蒋志碧的连载。“从 0 开始开发一款直播 APP ”系列来聊聊时下最火的直播 APP,如何完整的实现一个类"腾讯直播"的商业化项目
视频地址:http://www.cniao5.com/course/10121
【从 0 开始开发一款直播 APP】4.1 网络封装之 Okhttp -- 基础回顾
【从 0 开始开发一款直播 APP】4.2 网络封装之 OkHttp -- GET,POST,前后端交互
【从 0 开始开发一款直播 APP】4.3 网络封装之 OkHttp -- 封装 GET,POST FORM,POST JSON
【从 0 开始开发一款直播 APP】4.4 网络封装之 OkHttp -- 网络请求实现直播登录
一、前言
在讲 OkHttp 封装之前,我想整理下基础知识,一直对网络编程没有系统学习过,借着这大好时机,想认真学习下 OkHttp 的请求与响应,OkHttp 基本使用以及前后端交互,Okhttp 封装等,一看就有好多要学啊,是的,真的很多,不过没关系,整理起来就对 Okhttp 有了更加系统的认识,这是我想要的效果。
二、Http 请求与响应步骤
1.1 建立 TCP 连接
Http 在开始工作之前,web 浏览器首先要通过网络与 web 服务器建立连接,该连接是通过 TCP/Ip 协议 来完成的,TCP 连接最熟悉的是三次握手,所谓三次握手,我的理解是:第一次客户端向服务器发出连接服务器请求。第二次是服务端响应客户端请求并告知客户端已接收到请求。第三次客户端告知服务端接收到响应,可以进行数据可靠传输了。
1.2 web 浏览器向服务端发送请求命令
一旦建立 TCP 连接,web 浏览器就会向服务器发送请求命令。
http://192.168.43.238:8080/okhttp/login?username=dali&password=123
协议 服务器地址 资源地址 请求参数
GET /okhttp HTTP/1.1
请求行(请求方式 资源地址 协议脚本)
1.3 web 浏览器发送请求头信息
浏览器发送其请求命令之后,要以头信息形式向web服务器发送用于描述浏览器的信息,之后用一行空白行通知服务器,表示结束投信息的发送。若是 Post 请求,发送完请求头信息之后还要发送请求体。
1.4 web 服务器应答
客户端向服务器发出请求后,服务器会向客户端产生应答。
HTTP/1.1 200 OK
响应行(响应协议 状态码 状态信息)
1.5 web 服务器发送应答头信息
服务器响应客户发送的数据及其请求文档,最后以一行空白行表示头信息发送结束。
1.6 web 服务器向浏览器发送数据
web 服务器向浏览器发送头信息后,它就以 Content-type 应大头信息所描述的格式发送用户请求的实际数据。
1.7 web 服务器关闭 TCP 连接
一般情况下,一旦 web 服务器向浏览器发送了请求数据,它要关闭 TCP 连接,如果浏览器或服务器在头信息加入Connection:keep-alive 这行代码,TCP 连接在发送后仍要保持打开状态,浏览器可以继续通过相同的连接发送请求,保持连接节省了为每个请求建立新连接所需的时间, 还节约了网络带宽。
二、OkHttp 类与 Http 请求响应的映射
2.1、HTTP 请求
http请求由三部分组成,分别是:请求行(请求方法,请求地址,协议版本)、请求头、请求体
2.1.1、请求行
用于声明 ” 请求报文 “、主机域名、资源路径和协议版本
请求方法
请求方法 | 说明 |
---|---|
CET | 请求获取 Request-URI 所标识的资源 |
POST | 请求获取 Request-URI 所标识的资源 |
HEAD | 请求获取由 Request-URI 所标识的资源的响应消息报头 |
PUT | 请求服务器存储一个资源,并用 Request-URI 作为其标识 |
DELETE | 请求服务器删除 Request-URI 所标识的资源 |
TRACE | 请求服务器回送收到的请求信息,主要用于测试或诊断 |
CONNECT | 保留将来使用 |
OPTIONS | 请求查询服务器的性能,或者查询与资源相关的选项和需求 |
请求路径
定义:Uniform Resoure Locator,统一资源定位符,是一种自愿位置的抽象唯一识别方法。
作用:用于表示资源位置和访问这些资源的方法
组成:
<协议>://<主机>:<端口>/<路径>
- 协议:采用的应用层通信协议,比如在HTTP协议下的URL地址:
HTTP://<主机>:<端口>/<路径> - 主机:请求资源所在主机的域名
- 端口和路径有时可以省略(HTTP默认端口号是80)
协议版本
HTTP协议版本主要是1.0、1.1、2.0
2.1.2、请求头
作用:说明客户端、服务器或报文的部分信息
使用方式:采用” header(字段名):value(值)“的方式
举个栗子(菜鸟窝官网 Request Header)
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding:gzip, deflate, sdch
Accept-Language:zh-CN,zh;q=0.8,en;q=0.6
Cache-Control:max-age=0
Connection:keep-alive
2.1.3、请求体
作用:用于存放需要发送给服务器的数据信息
使用方式:
1、数据交换格式
请求体可以是任意格式的,服务器需要解析,如 JSON
2、键值对形式
键与值之间用 ” = “ 连接,每个键值对间用 & 连接,且只能用ASCII字符,如 Query String
3、分部分形式
请求体被分为多个部分,应用场景是文件上传,比如邮件上传等等
每段以-- {boundary}开头
然后是该段的描述头
描述头之后空一行接内容
每段以-- {boundary}--结束
(请求体1) -- {boundary} (开头)
Content-Disposition:from-data;name="name"(描述头)
(空格)
hello http (内容)
(请求体2) -- {boundary} (开头)
Content-Disposition:from-data;name="name"(描述头)
(空格)
hello http (内容)
(请求体结束标志) --{boundary}--
2.2、HTTP 响应
HTTP响应也是由三个部分组成,分别是:状态行(协议版本,状态码,状态信息)、响应头、响应正文
2.2.1、状态行(空格不能省)
协议版本
HTTP协议版本主要是1.0、1.1、2.0
状态码
状态码分为 5 大类
| 状态码 | 描述 | 说明 |
| ---------- | --- |
| 200 | OK | 客户端请求成功 |
| 400 | Bad Request | 由于客户端请求有语法错误,不能被服务器所理解。 |
| 401 | Unauthonzed | 请求未经授权。这个状态代码必须和WWW-Authenticate报头域一起使用 |
| 403 | Forbidden | 服务器收到请求,但是拒绝提供服务。服务器通常会在响应正文中给出不提供服务的原因 |
| 404 | Not Found | 请求的资源不存在,例如,输入了错误的URL。 |
| 500 | Internal Server Error | 服务器发生不可预期的错误,导致无法完成客户端的请求。 |
| 503 | Service Unavailable | 服务器当前不能够处理客户端的请求,在一段时间之后,服务器可能会恢复正常。 |
状态信息:对状态码进行描述
2.2.2、响应头
2.2.3、响应体
作用:用于存放需要返回给客户端的数据信息
使用方式:和请求体是一致的,同样分为:任意类型的数据交换格式、键值对形式和分部分形式,这里不作过多描述。
2.3、GET 请求和应答
这里推荐一个抓包工具:
fiddler Fiddler应用教程
charles Charles应用教程
先构建一个 GET 请求,设置如下:
可以看到,GET 请求基本设置:请求方法,请求地址,请求协议和请求头。
接下来看请求响应:
2.4 POST 请求和应答
请求方法为 post,请求地址是菜鸟窝登录地址:http://www.cniao5.com/auth/login.html 。请求协议:HTTP/1.1。
Http 请求类库,应该包含请求方法,请求地址,请求协议,请求头,请求体五部分,查看OkHttp 的 Request 类
private final HttpUrl url;//请求地址
private final String method;//请求方法 GET POST
private final Headers headers;//请求头
private final RequestBody body;//请求体
private final Object tag;//用于取消 Http 请求的标志
Http Response
OkHttp 的 Response 类:
private final Request request;//持有的请求
private final Protocol protocol;//请求协议
private final int code;//响应状态码
private final String message;//描述信息
private final Handshake handshake;//SSL/TLS握手协议验证时的信息
private final Headers headers;//响应头
private final ResponseBody body;//响应体
private Response networkResponse;
private Response cacheResponse;
private final Response priorResponse;
可以看到大体由应答首行,应答头,应答体构成。但是应答首行表达的信息过多, HTTP/1.1 表示访问协议, 200 是响应码, OK 是描述状态的消息。 根据单一职责,我们不应该把这么多内容用一个应答首行来表示。这样的话, 我们的响应就应该由访问协议, 响应码, 描述信息,响应头,响应体来组成。
三、总结
OkHttp 基础知识暂时就讲解这么多,基础很重要,看了这些,小编也对网络编程有了更多的认识,希望你也能学到更多。
关注公众号免费领取“N套客户端实战项目教程”更多内容,请关注菜鸟窝(微信公众号ID: cniao5),程序猿的在线学习平台。 转载请注明出处,本文出自菜鸟窝,原文链接http://www.cniao5.com/forum/thread/26159cc219e511e7a3c000163e0230fa
网友评论