HTTP的请求和响应

The perfect decks itself in beauty for the love of the Imperfect.

“完全”为了对“不全”的爱,把自己装饰得美丽。  

HTTP

参考手册

超文本传输协议(Hyper Text Transfer Protocol,HTTP)是一个简单的请求-响应协议,它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。请求和响应消息的头以ASCII形式给出;而消息内容则具有一个类似MIME的格式。这个简单模型是早期Web成功的有功之臣,因为它使开发和部署非常地直截了当。

HTTP是基于TCP/IP协议的,可以使用http进行内容的传输,比如图片,视频,音频,文档等等。

客户端和服务端需要进行通信的话,通常会使用request response cycle的形式。

客户端需要发送request请求,这样服务端才知道要通信;之后,服务端对请求进行response响应

  1. HTTP是无连接的:在发出请求后,客户端和服务端断开连接,然后当响应准备就绪的时候,服务端再次重新建立连接并发送响应。
  2. HTTP可以提供任何类型的数据,只要客户端和服务端两边的电脑能够读取理解它。
  3. HTTP是无状态的:客户端和服务器只是在当前请求期间了解彼此。如果它关闭了,并且两台电脑想要再次连接,它们需要重新提供信息。

request请求

HTTP请求信息由部分组成

  1. 请求方法(GET/POST)、URI、协议/版本

  2. 请求头(Request Header)

  3. 请求正文

1
2
3
4
5
6
7
8
9
10
GET /5bU_dTmfKgQFm2e88IuM_a/union.gif HTTP/1.1
-------------------------------------------------
Cookie: XXXxXxxxxxxxxxxxxxxxx
Accept: image/webp,image/png,image/svg+xml,image/*;q=0.8,video/*;q=0.8,*/*;q=0.5
Accept-Encoding: gzip, deflate, br
Host: sp1.baidu.com
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.1 Safari/605.1.15
Accept-Language: zh-CN,zh-Hans;q=0.9
Referer: https://www.baidu.com/s?wd=baidu&tn=84053098_3_dg&ie=utf-8
Connection: keep-alive

请求方法、URI、协议版本

根据HTTP标准,HTTP请求可以使用多种请求方法。例如:HTTP1.1目前支持7种请求方

请求方法 介绍
GET 请求获取由Request-URI所标识的资源
POST 在Request-URI所标识的资源后附加新的数据
HEAD 请求获取由Request-URI所标识的资源的响应消息报头
OPTIONS 请求查询服务器的性能,或查询与资源相关的选项和需求
PUT 请求服务器存储一个资源,并用Request-URI作为其标识
DELETE 请求服务器删除由Request-URI所标识的资源
TRACE 请求服务器回送收到的请求信息,主要用语测试或诊断

请求头(Request Header)

请求头包含许多有关的客户端环境和请求正文的有用信息。

请求头 介绍
Cookie 这是最重要的请求头信息之一
Accept 浏览器可接受的MIME类型
Accept-Encoding 浏览器能够进行解码的数据编码方式,比如gzip。Servlet能够向支持gzip的浏览器返回经gzip编码的HTML页面。许多情形下这可以减少5到10倍的下载时间
Host 指定请求资源的Intenet主机和端口号,必须表示请求url的原始服务器或网关的位置。HTTP/1.1请求必须包含主机头域,否则系统会以400状态码返回
User-Agent 浏览器类型,如果Servlet返回的内容与浏览器类型有关则该值非常有用
Accept-Language 浏览器所希望的语言种类,当服务器能够提供一种以上的语言版本时要用到
Referer 包含一个URL,用户从该URL代表的页面出发访问当前请求的页面
Connection 表示是否需要持久连接。如果Servlet看到这里的值为“Keep- Alive”,或者看到请求使用的是HTTP1.1(HTTP 1.1默认进行持久连接),它就可以利用持久连接的优点,当页面包含多个元素时(例如Applet,图片),显著地减少下载所需要的时间。要实现这一点,Servlet需要在应答中发送一个Content-Length头,最简单的实现方法是:先把内容写入 ByteArrayOutputStream,然后在正式写出内容之前计算它的大小
Referer 包含一个URL,用户从该URL代表的页面出发访问当前请求的页面
Accept-Charset 浏览器可接受的字符集
Authorization 授权信息,通常出现在对服务器发送的WWW-Authenticate头的应答中
From 请求发送者的email地址,由一些特殊的Web客户程序使用,浏览器不会用到它
If-Modified-Since 只有当所请求的内容在指定的日期之后又经过修改才返回它,否则返回304“Not Modified”应答
Pragma 指定“no-cache”值表示服务器必须返回一个刷新后的文档,即使它是代理服务器而且已经有了页面的本地拷贝

请求正文

请求头和请求正文之间是一个空行,这个行非常重要,它表示请求头已经结束,接下来的是请求正文。请求正文中可以包含客户提交的查询字符串信息

Response响应

HTTP应答与HTTP请求相似,HTTP响应也由3个部分构成,分别是:

  1. 状态行

  2. 响应头(Response Header)

  3. 响应正文

1
2
3
4
5
6
7
8
9
10
11
12
13
HTTP/1.1 200 OK
------------------------------------------------------
Content-Type: image/gif
Set-Cookie: BDORZ=FFFB88E999055A3F8A630C64834BD6D0; max-age=86400; domain=.baidu.com; path=/
Last-Modified: Wed, 07 Nov 2012 16:00:00 GMT
Cache-Control: max-age=315360000
Connection: Keep-Alive
Date: Fri, 31 Dec 2021 11:14:09 GMT
Accept-Ranges: bytes
Content-Length: 0
Expires: Mon, 29 Dec 2031 11:14:09 GMT
ETag: "0-0509a8580"
Server: Apache 2.0

状态行

由协议版本、数字形式的状态代码、及相应的状态描述,各元素之间以空格分隔。

  • 状态代码:状态代码由3位数字组成,表示请求是否被理解或被满足。
  • 状态描述:状态描述给出了关于状态代码的简短的文字描述。
  • 状态代码的第一个数字定义了响应的类别,后面两位没有具体的分类。
    • 第一个数字有五种可能的取值:
      • - 1xx: 指示信息—表示请求已接收,继续处理。
      • - 2xx: 成功—表示请求已经被成功接收、理解、接受。
      • - 3xx: 重定向—要完成请求必须进行更进一步的操作。
      • - 4xx: 客户端错误—请求有语法错误或请求无法实现。
      • - 5xx: 服务器端错误—服务器未能实现合法的请求。
状态代码 状态描述 说明
200 OK 客户端请求成功
400 Bad Request 由于客户端请求有语法错误,不能被服务器所理解
401 Unauthonzed 请求未经授权。这个状态代码必须和WWW-Authenticate报头域一起使用
403 Forbidden 服务器收到请求,但是拒绝提供服务。服务器通常会在响应正文中给出不提供服务的原因
404 Not Found 请求的资源不存在,例如,输入了错误的URL
500 Internal Server Error 服务器发生不可预期的错误,导致无法完成客户端的请求。
503 Service Unavailable 服务器当前不能够处理客户端的请求,在一段时间之后,服务器可能会恢复正常

响应头

请求头 介绍
Content-Type Content-Type实体报头域用语指明发送给接收者的实体正文的媒体类型
Set-Cookie 浏览器会在当前页面所在域名设置cookie字符串
Last-Modified Last-Modified实体报头域用于指示资源最后的修改日期及时间
Cache-Control 通用头字段用于指定在两个,请求和响应的缓存机制的指令。缓存指令是单向的,这意味着请求中的给定指令并不意味着将在响应中给出相同的指令
Connection 表示是否需要持久连接。如果Servlet看到这里的值为“Keep- Alive”,或者看到请求使用的是HTTP1.1(HTTP 1.1默认进行持久连接),它就可以利用持久连接的优点,当页面包含多个元素时(例如Applet,图片),显著地减少下载所需要的时间。要实现这一点,Servlet需要在应答中发送一个Content-Length头,最简单的实现方法是:先把内容写入 ByteArrayOutputStream,然后在正式写出内容之前计算它的大小
Date 通用 HTTP 报头包含在该消息起源的日期和时间。
Accept-Ranges 响应的 HTTP 标头是由服务器使用以通告其支持部分请求的标志物。此字段的值表示可用于定义范围的单位。
Content-Length 实体报头指示该实体主体的大小,以字节为单位的十进制数,发送到接收方
Expires 标头包含的日期/时间之后,响应被视为失效。
ETag HTTP 响应报头为资源的特定版本的标识符。它允许缓存更高效,并节省带宽,因为如果内容没有改变,Web 服务器不需要发送完整的响应。另一方面,如果内容发生了变化,etags 有助于防止资源的同时更新互相覆盖(“空中冲突”)。 如果给定 URL 处的资源发生更改,则Etag必须生成新值。因此,Etags 与指纹相似,也可能用于某些服务器的跟踪目的。它们的比较可以快速确定资源的两个表示是否相同,但它们也可能被设置为无限期地由跟踪服务器持续存在。
Server 头包含有关用作原始服务器处理请求的软件信息。
查看评论