【PHP 语言】HTTP 的主要方法和状态码

HTTP的主要方法

浏览器的第一步工作是对 URL 进行解析,当解析完成以后接下来就是浏览器需要告诉服务器进行怎样的操作,我们称之为方法。最常用的方法是GETPOST方法,除此之外还有很多其他的方法,比如PUTDELETE 等方法,我们需要认真思考一下它们的含义,以便理解 HTTP 协议具备的所有功能,以下为HTTP的主要方法及其含义:

方法 含义
GET 获取 URI指定的信息。如果 URI 指定的是文件,则返回文件的内容;如果 URI指定的是 CGI程序,则返回该程序的输出数据。
POST 从客户端向服务器发送数据。一般用于发送表单中填写的数据等情况下。
HEAD GET 基本相同。不过它只返回 HTTP 的消息头 (message header),而并不返回数据的内容。用于获取文件最后更新时间等属性信息。
OPTIONS 用于通知或查询通信选项。
PUT 替换 URI 指定的服务器上的文件。如果 URI 指定的文件不存在,则创建该文件。
DELETE 删除 URI 指定的服务器上的文件。
TRACE 将服务器收到的请求行和头部(header)直接返回给客户端。用于在使用代理的环境中检查改写请求 的情况。
CONNECT 使用代理传输加密消息时使用的方法。

问:GET和POST 的区别?

这个问题看似很简单,其实网上的很多答案都是不正确的。从标准上来看,GETPOST的区别如下:

  • GET 用于获取资源,是无副作用的,是幂等的,且可缓存。

  • POST 用于处理资源,有副作用,非幂等,不可缓存。

可以用以下图来表示:

幂等性 改变服务器上资源的状态 不改变服务器上资源的状态
幂等 PUT GET
非幂等 POST

首先我们需要知道RFC7231里定义了HTTP方法的几个性质:

  • Safe - 安全性。这里的「安全」和通常理解的「安全」意义不同,如果一个方法的语义在本质上是「只读」的,那么这个方法就是安全的。客户端向服务端的资源发起的请求如果使用了是安全的方法,就不应该引起服务端任何的状态变化,因此也是无害的。 此RFC定义,GETHEADOPTIONSTRACE 这几个方法是安全的。但是这个定义只是规范,并不能保证方法的实现也是安全的,服务端的实现可能会不符合方法语义,比如说可以使用GET修改用户信息的情况。引入安全这个概念的目的是为了方便网络爬虫和缓存,以免调用或者缓存某些不安全方法时引起某些意外的后果。User Agent(浏览器)应该在执行安全和不安全方法时做出区分对待,并给用户以提示。

  • Idempotent- 幂等性。幂等性的概念是指同一个请求方法执行多次和仅执行一次的效果完全相同。按照RFC规范,PUTDELETE都是幂等的。同样,这也仅仅是规范,服务端实现是否幂等是无法确保的。引入幂等主要是为了处理同一个请求重复发送的情况,比如在请求响应前失去连接,如果方法是幂等的,就可以放心地重发一次请求。这也是浏览器在后退或者刷新时遇到POST会给用户提示的原因:POST语义不是幂等的,重复请求可能会带来意想不到的后果。

  • Cacheable - 可缓存性。顾名思义就是一个方法是否可以被缓存,此RFCGETHEAD和某些情况下的POST都是可缓存的,但是绝大多数的浏览器的实现里仅仅支持GETHEAD

关于GETPOST 这两种方法的语义,RFC7231里原文定义如下:

The GET method requests transfer of a current selected representation for the target resource. GET is the primary mechanism of information retrieval and the focus of almost all performance optimizations. Hence, when people speak of retrieving some identifiable information via HTTP, they are generally referring to making a GET request.A payload within a GET request message has no defined semantics; sending a payload body on a GET request might cause some existing implementations to reject the request.

The POST method requests that the target resource process the representation enclosed in the request according to the resource’s own specific semantics.

以下为错误的认识:

GET方法对数据长度有限制而POST方法没有限制?事实上,HTTP协议明确地指出了,HTTP头和Body都没有长度的要求,对 URL 限制的大多是浏览器和服务器的原因。服务器是因为处理长 URL 要消耗比较多的资源,为了性能和安全(防止恶意构造长 URL 来攻击)考虑,会给 URL 长度加限制,如果有人恶意地构造几个几M大小的URL,并不停地访问你的服务器,服务器性能就会下降。

POST 方法比GET方法安全?有人说POSTGET安全,因为数据在地址栏上不可见。然而,从传输的角度来说,他们都是不安全的,因为 HTTP 在网络上是明文传输的,只要在网络节点上抓包,就能完整地获取数据报文,要想安全传输,就只有加密,也就是 HTTPS进行传输。

HTTP状态码

HTTP 响应消息中状态码的第一位数字表示状态类型,第二、三位数字表示具体的情况。下表列举了第一位数字的含义,HTTP状态码分类:

分类 分类描述
1xx 告知请求的处理进度和情况,服务器收到请求,需要请求者继续执行操作
2xx 成功,操作被成功接收并处理
3xx 表示需要进一步操作
4xx 客户端错误,请求包含语法错误或无法完成请求
5xx 服务器错误,服务器在处理请求的过程中发生了错误

常用的HTTP状态码:

状态码 英文 说明
100 Continue 继续。客户端应继续其请求
200 OK 请求成功
300 Multiple Choices 请求的资源可包括多个位置
301 Moved Permanently 资源(网页等)被永久转移到其它URL
302 Temporarily Moved 临时重定向,暂时性转移
304 Not Modified 客户端已经执行了GET,但文件未变化。
400 Bad Request 客户端请求的语法错误,服务器无法理解
403 Forbidden 服务器已经理解请求,但是拒绝执行它
404 Not Found 请求的资源(网页等)不存在
500 Internal Server Error 内部服务器错误
502 Bad Gateway 服务器接收到上游服务器的无效响应
504 Gateway Time-out 网关超时,上游服务器超时

相关推荐

微信扫一扫,分享到朋友圈

【PHP 语言】HTTP 的主要方法和状态码
返回顶部

显示

忘记密码?

显示

显示

获取验证码

Close