1. HTTP请求

首先说明下HTTP请求的格式,如下图所示:

通常想要服务器知道你请求的内容,至少要具备三部分,最多需要四部分。

  • 第一部分请求方法、请求URI和协议版本
  • 第二部分以键值对的形式存放的主机地址,请求类型,请求长度等首部字段
  • 第三部分以空行(\n)区分内容实体和首部字段
  • 第四部分请求的内容实体,可有可无

常见的请求首部资源有:

  • Host:请求的主机名,允许多个域名同处一个IP地址,即虚拟主机
  • User-Agent:发送请求的浏览器类型、操作系统等信息
  • Accept:客户端可识别的内容类型列表,用于指定客户端接收那些类型的信息
  • Accept-Encoding:客户端可识别的数据编码
  • Accept-Language:表示浏览器所支持的语言类型
  • Connection:允许客户端和服务器指定与请求/响应连接有关的选项,例如这是为Keep-Alive则表示保持连接。
  • Transfer-Encoding:告知接收端为了保证报文的可靠传输,对报文采用了什么编码方式。

以请求百度为例,在Chrome的开发者工具network面板中可以很直观的看到请求体的内容:

另外也可以直接通过unix系统自带的bash命令curl来查看请求头的内容:

curl -X POST -s -v -H "test: xxx" -- "https://www.baidu.com
  • -X 是指请求的方法:如GET POST DELETE PUT PATCH OPENTION HEAD等方法
  • -s 是指不显示进度表或错误消息
  • -v 根据响应内容添加辅助标记,对调试非常有用。其中以“>”开头的行表示由curl发送的“标题数据”,“<”表示由隐藏的curl接收的“标题数据”,正常情况,以'*'开头的行表示curl提供的其他信息。
  • -H "test: xxx"可以指定任意数量的额外请求头
  • -- "https://www.baidu.com 代要求请求的网址

返回的结果中,代表请求头的内容如图所示:

2. HTTP响应

响应体的格式和请求体类似,但是具体字段出入较大,且一般都会有响应主体,具体结构如图所示:

常见的响应头有:

  • Content-Type:发送给接收者的实体正文的媒体类型。HTTP content-type 对照表
  • Content-Lenght:实体正文的长度
  • Content-Language:描述资源所用的自然语言,没有设置则该选项则认为实体内容将提供给所有的语言阅读
  • Content-Encoding:实体报头被用作媒体类型的修饰符,它的值指示了已经被应用到实体正文的附加内容的编码,因而要获得Content-Type报头域中所引用的媒体类型,必须采用相应的解码机制。
  • Last-Modified:实体报头用于指示资源的最后修改日期和时间
  • Expires:实体报头给出响应过期的日期和时间

在Chrome的Network面板中长这样:

在curl命令中的响应体也是一致的:

3. 状态码

常见的HTTP状态码有若干种,大概整理一下可以分为这几类:

  • 1XX:请求收到,继续处理
  • 2XX:操作成功收到,分析、接受
  • 3XX:完成此请求必须进一步处理
  • 4XX:请求包含一个错误语法或不能完成
  • 5XX:服务器执行一个完全有效请求失败

以下具体的状态码供后续用到的时候速查:

状态码 意义
100 客户必须继续发出请求
101 客户要求服务器根据请求转换HTTP协议版本
200 交易成功
201 提示知道新文件的URL
202 接受和处理、但处理未完成
203 返回信息不确定或不完整
204 请求收到,但返回信息为空
205 服务器完成了请求,用户代理必须复位当前已经浏览过的文件
206 服务器已经完成了部分用户的GET请求
300 请求的资源可在多处得到
301 删除请求数据
302 在其他地址发现了请求数据
303 建议客户访问其他URL或访问方式
304 客户端已经执行了GET,但文件未变化
305 请求的资源必须从服务器指定的地址得到
306 前一版本HTTP中使用的代码,现行版本中不再使用
307 申明请求的资源临时性删除
400 错误请求,如语法错误
401 请求授权失败
402 保留有效ChargeTo头响应
403 请求不允许
404 没有发现文件、查询或URl
405 用户在Request-Line字段定义的方法不允许
406 根据用户发送的Accept拖,请求资源不可访问
407 类似401,用户必须首先在代理服务器上得到授权
408 客户端没有在用户指定的饿时间内完成请求
409 对当前资源状态,请求不能完成
410 服务器上不再有此资源且无进一步的参考地址
411 服务器拒绝用户定义的Content-Length属性请求
412 一个或多个请求头字段在当前请求中错误
413 请求的资源大于服务器允许的大小
414 请求的资源URL长于服务器允许的长度
415 请求资源不支持请求项目格式
416 请求中包含Range请求头字段,在当前请求资源范围内没有range指示值,请求也不包含If-Range请求头字段
417 服务器不满足请求Expect头字段指定的期望值,如果是代理服务器,可能是下 一级服务器不能满足请求
500 服务器产生内部错误
501 服务器不支持请求的函数
502 服务器暂时不可用,有时是为了防止发生系统过载
503 服务器过载或暂停维修
504 关口过载,服务器使用另一个关口或服务来响应用户,等待时间设定值较长
505 服务器不支持或拒绝支请求头中指定的HTTP版本

4. 参考文章