Android 网络编程知识(HTTP 篇)
HTTP 是什么
了解这个之前需要先了解计算机网络的基本知识
计算机网络分为上下五层:物理层、数据链路层、网络层、运输层、应用层
| 原理性网络分层 |
|---|
| 应用层 |
| 运输层 |
| 网络层 |
| 数据链路层 |
| 物理层 |
其中:
- 网络层:负责根据IP找到目的地址的主机
- 运输层:通过端口把数据传到目的主机的目的进程,来实现进程与进程之间的通信
定义
HTTP 的全称是 HyperText Transfer Protocol,超文本传输协议,HTTP是一个应用层协议,由请求和响应构成,是一个标准的客户端服务器模型。HTTP是一个无状态的协议。
作用
HTTP协议(HyperText Transfer Protocol,超文本传输协议)是用于从WWW服务器传输超文本到本地浏览器的传输协议。它可以使浏览器更加高效,使网络传输减少。它不仅保证计算机正确快速地传输超文本文档,还确定传输文档中的哪一部分,以及哪部分内容首先显示(如文本先于图形)等。
HTTP是客户端浏览器或其他程序与Web服务器之间的应用层通信协议。在Internet上的Web服务器上存放的都是超文本信息,客户机需要通过HTTP协议传输所要访问的超文本信息。HTTP包含命令和传输信息,不仅可用于Web访问,也可以用于其他因特网/内联网应用系统之间的通信,从而实现各类应用资源超媒体访问的集成。
特点
- 支持客户/服务器模式、浏览器/服务器模式。
- 简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
- 灵活:HTTP允许传输任意类型的数据对象。
- 无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
- 无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
- 传输可靠性高:采用TCP作为运输层协议(面向连接、可靠传输),即交换报文时需要预先建立TCP连接
HTTP 报文
报文分为请求报文与响应报文
请求报文
一个HTTP请求报文由
- 请求行
- 请求头
- 空行
- 请求包体
4个部分组成,下图给出了请求报文的一般格式。

请求行
| 请求方法 | 空格 | 请求路径 | 空格 | 协议版本 | \r\n |
|---|---|---|---|---|---|
| GET | chinnsenn.com | HTTP/1.1 |
其中参数之间用空格做分隔,故不能省略,结尾使用回车符与换行符。
请求方法
有以下八种:
| 方法类别 | 意义 |
|---|---|
| OPTION | 请求“选项”的信息 |
| HEAD | 请求读取”URL标志信息的首部“信息 |
| GET | 请求读取“URL标志的信息“的信息 |
| POST | 为服务器添加信息 |
| PUT | 为指定的URL下添加(存储)一个文档 |
| DELETE | 删除指定URL所标志的信息 |
| TRACE | 用于进行环回测试的请求报文 |
| CONNECT | 用于代理服务器 |
常用的是 GET 和 POST 方法(实际上两者可以通用,只是大家都遵守规则,世界更和谐)。
请求路径
这里的路径指的是 URL 的路径
什么是 URL ?
- 定义:Uniform Resource Locator,统一资源定位符。
- 作用:用于表示自愿位置与访问方法。
- 组成:<协议>://<主机>:<端口>/<路径> (有时可省略)
举个栗子:
| 协议 | 主机 | 端口 | 路径 |
|---|---|---|---|
| https | chinnsenn.com | 80(已省略) | /2017/06/25/android-http |
路径就是跟在端口号后面的部分
协议版本
HTTP 1.0、HTTP 1.1以及HTTP 2.0 三个协议版本
具体看这里 HTTP协议的前世今生——各版本HTTP协议对比
举个栗子:
- URL: https://chinnsenn.com/2017/06/25/android-http/
- 请求方法: GET
- 协议版本: 1.1
- 请求行就写作: GET /2017/06/25/android-http HTTP/1.1
请求头
- 作用:说明客户端、服务器或报文的部分信息
- 方式:Header:Value
常用请求头
1.通用 Header (请求和响应)
| 名称 | 作用 |
|---|---|
| Content-Type | 请求体/响应体的类型,如:text/plain,application/json |
| Accept | 说明接收的类型,可以多值,用,(半角逗号)分隔 |
| Content-Length | 请求体/响应体的长度,单位字节 |
| Accept-Enconding | 告知对方我方接收的 Content-Encoding |
| ETag | 给当前资源的标识,和Last-Modifed , If-None-Match , If-Modified-Since配合 , 用于缓存控制 |
| Cache-Control | 缓存有效期,一般为 no-cache (不缓存) 或 max-age=XX,(XX单位为秒) |
2.常用请求 Header
| 名称 | 作用 |
|---|---|
| Authorization | 用于设置身份认证信息 |
| Uset-Agent | 用于标识,如:OS和浏览器的类型和版本 |
| If-Modified-Sine | 值是上次服务器返回的 Last-Modified 值,用于确认某个资源是否在这个时间之后被修改过,304 表示没有修改过,直接存缓存中取出 |
| If-None-Match | 值为上次服务器返回的 ETag 值,一般会和 If-Modified-Since 一起出现 |
| Cookie | 已有的Cookie |
| Referer | 表示请求引用自哪个地址,比如你从页面 A 跳转到页面 B 时,值为页面 A 的地址 |
| Host | 请求的主机与端口号 |
更多请求头可以看这里 HTTP消息头(HTTP headers)-常用的HTTP请求头与响应头
举个栗子:
- URL 依然是:https://chinnsenn.com/2017/06/25/android-http/
- Host:chinnsenn.com
- User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36
- …
请求体
根据应用场景的不同,HTTP请求的请求体有三种不同的形式。
- 任意类型
请求体是可以是任意类型的,但服务器需要额外进行解析,如JSON或者XML
比如:
BASHPOST http://www.example.com HTTP/1.1
Content-Type: application/json;charset=utf-8
{"title":"test","sub":[1,2,3]}
更多关于 JSON 看这里 JSON简介及最全面解析方法
- Query String
这算是最常见的 POST 提交数据的方式了,以键值对的形式呈现,多个键值对之间用&连接,键与值之间用=连接,且只能用ASCII字符
比如:
POST http://www.example.com HTTP/1.1
Content-Type: application/x-www-form-urlencoded;charset=utf-8
title=test&sub%5B%5D=1&sub%5B%5D=2&sub%5B%5D=3
- 文件分割
请求体被分为多个部分,应用场景是文件上传,比如邮件上传等等。每个字段/文件都被boundary(Content-Type中指定)分成单独的段,每段以-- 加 boundary开头,然后是该段的描述头,描述头之后空一行接内容,请求结束的标制为boundary后面加–,结构见下图:

比如:
BASHPOST http://www.example.com HTTP/1.1
Content-Type:multipart/form-data; boundary=----WebKitFormBoundaryrGKCBY7qhFd3TrwA
------WebKitFormBoundaryrGKCBY7qhFd3TrwA
Content-Disposition: form-data; name="text"
title
------WebKitFormBoundaryrGKCBY7qhFd3TrwA
Content-Disposition: form-data; name="file"; filename="chrome.png"
Content-Type: image/png
PNG ... content of chrome.png ...
------WebKitFormBoundaryrGKCBY7qhFd3TrwA--
更多关于请求体看这里 HTTP 请求头与请求体
响应报文
与请求报文相比,除了第一行(请求行VS状态行)以外,响应报文的其他结构与请求报文非常相似。其中,响应体是用于存放需要返回给客户端的数据信息的。

同样的,空格不能省略。
状态行
协议版本
HTTP 1.0、HTTP 1.1以及HTTP 2.0 三个协议版本
具体看这里 HTTP协议的前世今生——各版本HTTP协议对比
状态码
分类:
| 类别 | 含义 |
|---|---|
| 1xx | 表示信息通知,如请求收到了或正在进行处理 |
| 2xx | 表示成功,如接受或知道了 |
| 3xx | 表示重定向,如要完成请求还必须采取进一步行动 |
| 4xx | 客户的差错,如请求中有错误的语法或不能完成:404 |
| 5xx | 表示服务器的差错,如服务器失效无法完成请求 |
详细解释看这里 状态码详解
响应头
大部分与请求头相似,这里列举几个常用响应头
| 名称 | 作用 |
|---|---|
| Date | 服务器日期 |
| Last-Modified | 资源最后被修改的时间 |
| Transfer-Encoding | 取值一般为 chunked ,出现在 Content-Length 不能确定的情况下,表示服务器不知道响应体的数据大小,一般还会出现 Content-Encoding 响应头 |
| Set-Cookie | 设置 Cookie |
| Location | 重定向到另一个 URL ,如在浏览器输入 baidu.com,会自动跳转到 https://www.baidu.com ,就是这个控制的 |
| Server | 后台服务器 |
响应体
- 作用:用于存放需要返回给客户端的数据信息
- 使用方式:与请求体一样
参考
HTTP协议的前世今生——各版本HTTP协议对比
HTTP请求&响应
你需要了解的HTTP知识都在这里了!
HTTP响应报文与工作原理详解
HTTP消息头(HTTP headers)-常用的HTTP请求头与响应头
HTTP 请求头与请求体
本文只为笔者加深印象之用,雷同之处皆出自参考列表。
Android 网络编程知识(HTTP 篇)