上一节我们讲解了 http 的请求和响应的报文结构,其中我们就说到请求行中包含了请求方法、请求 URI 和 http 协议版本信息,响应行中包含了 http 协议版本信息和响应的状态码。那这一节我们就来了解一下 http 请求方法的种类和响应的状态码的种类。

请求方法

http1.1 常用的请求方法包括:get、post、put、delete、head、options、trace、connect。

get
用来请求访问已被 URI 识别的资源。是 http 默认的请求方法,当我们在浏览器地址栏直接输入请求地址时,浏览器采用的就是 get 的方法。

get 也可以用来提交表单和其他数据,如:http://localhost/login.php?username=aa&password=123 ,从这个 URL 请求中,很容易就可以辨认出表单提交的内容。

浏览器对于提交的 URL 的长度也是有限制的。

image.png

post
post 方法与 get 功能类似,一般用来传输实体的主体。
post 方法的主要目的不是获取响应主体的内容,而是用来做请求提交表单的数据,尤其是大量的表单数据。
post 在请求时,数据不再作为 URL 的一部分,而是作为标准数据传输给服务器,这就克服了 get 请求时传输的数据无法保密和传输的数据量太小的问题。出于对安全考虑和用户隐私的保密,一般表单提交都采用的是 post 请求。
image.png

:::info post 和 get 请求的区别?

  • get 请求提交数据是放在 url 中,而 post 请求是放在 http 数据包的;
  • get 请求有长度限制,post 请求没有这个限制(post 请求的数据包是一个个的);
  • get 请求的参数是放在地址栏上的,安全性不及 post 高。 :::

put
put 和 post 在用法上是相同的,都是用来提交参数的;
put 从客户端向服务端传送的数据取代指定的文档的内容。

put 与 post 有一个本质的区别是:put 是幂等的,而 post 不是幂等的。不管进行多少次的重复操作,都是实现相同的解决。举个生活的例子就是我挖了一块地,如果我在这块地上种花,种树等都是在原有的这块地上进行的,不会增加或者减少这块地,这就是 put 操作;而如果我又挖了一块新的地,那这就是 post 操作。

所以我们经常在创建对象时用 post,更新对象时用 put。但 http1.1 中的 put 请求方法不带有验证机制,其实它是存在一定的安全性问题的,所以一般的网站不使用 put 方法,而通过 post 请求来做后端逻辑处理。

**
head 方法跟 get 方法基本是相同的,它们的区别在于 head 只请求消息的报文头,而不是完整的内容,对于 head 请求的响应内容来说,它的 http 头部信息中包含的信息跟 get 请求得到的信息是相同的。所以 head 方法一般用来测试一个超链接的有效性。

delete
delete 方法与 post 方法相反,delete 方法是根据请求的 URI 去删除特定的资源内容。同样,http1.1 中的 delete 也没有验证机制,所以一般也不使用 delete 方法。

options
options 用来查询针对请求 URI 指定的资源支持的方法。当我们不知道服务器支持什么样的方法时进行询问。如下图,可以通过 options 请求,响应返回的服务器端支持的请求方法。
image.png

trace
更多时候用来回显服务器收到的请求,主要用来测试或者诊断。

客户端通过 trace 方法可以查询发送出去的请求是怎样被加工修改/篡改的。这是因为,请求想要连接到源目标服务器可能会通过代理中转,TRACE方法就是用来确认连接过程中发生的一系列操作。

但是,trace 方法本来就不怎么常用,再加上它容易引发 XST(Cross-Site Tracing,跨站追踪)攻击,通常就更不会用到了。 —-图解HTTP

connect
开启一个客户端与所请求资源之间的双向沟通的通道,它可用来创建隧道。当使用代理服务器来访问互联网的时候就是用 connect 方法。比如我们要通过一个 http 代理去访问 facebook,首先浏览器向代理服务器发送一个 connect 请求,代理服务器返回状态码 200,说明当前客户端与服务器已经连接成功了,可以互相传递数据,代理服务器在这个过程中只负责传递数据包,并不能读取具体的数据内容。

响应状态码

http 状态码表示客户端 http 请求的返回结果、标记服务端的处理是否正常、通知出现的错误等工作。

image.png

状态码由3位数字组成,其中第一位指定响应的类别。响应类型有以下5种:

分类 含义
1XX 代表请求已接受,需要继续处理。这类响应是临时响应,只包含状态行和某些可选的响应头信息,并以空行结束。
2XX 表示成功。这一类型的状态码,代表请求已成功被服务器接收、理解,并正常处理完毕。
3XX 表示重定向。这类状态码代表需要客户端采取进一步操作才能完成请求。通常这些状态码用来重定向,后续的请求地址(重定向目标)在本次响应的 Location 域中指明。
4XX 表示请求错误。这类请求代表客户端看起来可能发生了错误,妨碍了服务器的处理。除非响应的是一个 head 请求,否则服务器就应该返回一个解释当前错误状况的实体,以及这是临时的还是永久的。这些状态码适用于任何请求方法,浏览器应当向客户显示任何包含在此类错误响应中的实体内容。
5XX 表示服务器错误。这类请求代表服务器在处理请求时出错或状态发生异常,也有可能是服务器意识到以当前的软硬件资源无法完成对请求的处理。

下面讲解一些常见的 http 状态码。

状态码 状态码英文名称 描述
200 OK 请求已成功,请求所希望的响应头或数据体将随此响应返回
202 Accepted 已接受,已经接受请求,但未处理完成
206 Partial Content 部分内容,服务器成功处理了部分GET请求
301 Moved Permanently 永久重定向,请求的资源已被永久的移动到新URI,返回信息会包括新的URI,浏览器会自动定向到新URI。今后任何新的请求都应使用新的URI代替
302 Found 临时重定向,与301类似。但资源只是临时被移动。客户端应继续使用原有URI
304 Not Modified 客户端有缓冲的文件并发出了一个条件性的请求;服务端告诉客户端该资源自从请求之后没有发生改变,可以继续使用
400 Bad Request 客户端请求的语法错误,服务器无法理解
401 Unauthorized 请求要求用户的身份认证
403 Forbidden 服务器理解请求客户端的请求,但是拒绝执行此请求
404 Not Found 服务器无法根据客户端的请求找到资源(网页)。
500 Internet Server Error 服务器内部错误,无法完成请求
502 Bad Gateway 充当网关或代理的服务器,从远端服务器接收到了一个无效的请求

状态码301和308的区别

共同点:

  • 资源被永久移动到新的地址(根据 header 中的 location 字段)

差异:

  • 客户端收到 308 请求后,之前是什么 method,之后沿用这个 method(post/get/put等) 去请求新的地址;
  • 客户端收到 301 请求后,通常客户端会使用 get 方法进行请求。

状态码302/303/307的区别

共同点:

  • 资源临时移动到新的地址(根据 header 中的 location 字段)

差异:

  • 302 是 http1.1 提出的,最早叫做 Moved Temporarily,许多浏览器实现时没有遵照标准,把所有请求都重定向为 GET;
  • 1999 年标准委员会增加了 303 和 307,并将 302 重新定义为 Found;
  • 303 告诉客户端使用 get 方法重定向资源,307 告诉客户端使用原请求的 method 重定向资源。

:::info 303 和 307 是 302 的一个替代品,标准推荐使用这两个,但是目前很多公司都还是沿用 302。 :::

to be continue…