美文网首页网络相关Android知识Android技术知识
OkHttp 封装学不好,是漏了哪些基础知识?

OkHttp 封装学不好,是漏了哪些基础知识?

作者: 菜鸟窝 | 来源:发表于2017-08-03 17:36 被阅读291次
    0.jpg
    本文为菜鸟窝作者蒋志碧的连载。“从 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,统一资源定位符,是一种自愿位置的抽象唯一识别方法。
    作用:用于表示资源位置和访问这些资源的方法
    组成:

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

    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,请求地址是菜鸟窝登录地址: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 基础知识暂时就讲解这么多,基础很重要,看了这些,小编也对网络编程有了更多的认识,希望你也能学到更多。

    进入【菜鸟直播-直播app开发实战】群,

    群满可添加菜鸟窝运营微信:yrioyou联系入群
    记得备注【菜鸟直播交流群】哦

    关注菜鸟窝官网,免费领取“140套开源项目”

    相关文章

      网友评论

        本文标题:OkHttp 封装学不好,是漏了哪些基础知识?

        本文链接:https://www.haomeiwen.com/subject/egwplxtx.html