【从 0 开始开发一款直播 APP】4.1 网络封装之 Okhttp -- 基础回顾

538 阅读8分钟
本文为菜鸟窝作者蒋志碧的连载。“从 0 开始开发一款直播 APP ”系列来聊聊时下最火的直播 APP,如何完整的实现一个类”腾讯直播”的商业化项目
视频地址:www.cniao5.com/course/1012…

【从 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,统一资源定位符,是一种自愿位置的抽象唯一识别方法。
作用:用于表示资源位置和访问这些资源的方法
组成:

<协议>://<主机>:<端口>/<路径>

  1. 协议:采用的应用层通信协议,比如在HTTP协议下的URL地址:
    HTTP://<主机>:<端口>/<路径>
  2. 主机:请求资源所在主机的域名
  3. 端口和路径有时可以省略(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,请求地址是菜鸟窝登录地址:www.cniao5.com/auth/login.… 。请求协议: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 基础知识暂时就讲解这么多,基础很重要,看了这些,小编也对网络编程有了更多的认识,希望你也能学到更多。

菜鸟窝-程序猿的黄埔军校。 如需转载,请注明出处(菜鸟窝 , 原文链接: http://www.cniao5.com/forum/thread/26159cc219e511e7a3c000163e0230fa

关注公众号免费领取"140套优秀开源项目源码"