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

本文为菜鸟窝作者蒋志碧的连载。“从 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 基础知识暂时就讲解这么多,基础很重要,看了这些,小编也对网络编程有了更多的认识,希望你也能学到更多。

更多内容,请关注菜鸟窝(微信公众号ID: cniao5),程序猿的在线学习平台。 转载请注明出处,本文出自菜鸟窝,原文链接http://www.cniao5.com/forum/thread/26159cc219e511e7a3c000163e0230fa

关注公众号免费领取“N套客户端实战项目教程”
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,723评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,003评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,512评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,825评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,874评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,841评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,812评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,582评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,033评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,309评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,450评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,158评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,789评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,409评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,609评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,440评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,357评论 2 352

推荐阅读更多精彩内容