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个部分组成,下图给出了请求报文的一般格式。

HTTP请求报文

请求行

请求方法 空格 请求路径 空格 协议版本 \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/2017/06/25/android-http/

协议 主机 端口 路径
https chinnsenn.com 80(已省略) /2017/06/25/android-http

路径就是跟在端口号后面的部分

协议版本

HTTP 1.0、HTTP 1.1以及HTTP 2.0 三个协议版本

具体看这里 HTTP协议的前世今生——各版本HTTP协议对比

举个栗子:

请求头

  • 作用:说明客户端、服务器或报文的部分信息
  • 方式: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请求头与响应头

举个栗子:

请求体

根据应用场景的不同,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后面加–,结构见下图:

HTTP 请求格式

比如:

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 篇)

http://chinnsenn.com/2017/06/25/android-http/

作者

ChinnSenn

發表於

2017-06-25

更新於

2023-04-20

許可協議

評論