您的位置:首页 > 理论基础 > 计算机网络

HTTP状态码 - 302、303和307

2017-02-27 00:00 288 查看
摘要: 都是重定向跳转,你知道为什么要设置3个?

  周末在写项目UT的时候,基于REST-Assured来发HTTP请求,由于部分接口基于跳转机制,所以希望能够拿到跳转前的服务器响应实体,在这个过程中发现同样是基于302下发,但是对于GET请求和POST请求的客户端响应是不一样的,对于GET请求,客户端会立即跳转,但是POST请求则不会,如果要求跳转,需要手动去触发,于是翻了一下HTTP/1.1协议,其中有这样一句话:

If the 302 status code is received in response to a request other than GET or HEAD, the user agent MUST NOT automatically redirect the request unless it can be confirmed by the user, since this might change the conditions under which the request was issued.

  也就是说对于非GET或HEAD请求,浏览器不能自动的重定向到
Location
首部所指向的链接,除非得到用户的确认。协议这样去规定也是比较容易理解的,以POST请求为例,我们应该都知道 POST请求是非幂等的,也就是说两次同样的POST的请求所产生的结果往往是不一样的,为了防止这种非幂等性造成一些意想不到的的结果,所以协议才这样去规定,但是对于GET或HEAD请求,因为本来这类方法就是去获取服务器的资源,属于幂等操作,自动重定向请求也就无可厚非了。

  除了302,与之类似的状态码还有303和307,初次接触的时候,这几个状态码可能会让人感到疑惑,302是在HTTP/1.0协议中提出来的,而303和307则是在HTTP/1.1中提出,可以将303和307看作是对于302的一个细化,简言之,这两个新的状态的语义如下:

303 : 对于POST请求,它表示请求已经被处理,客户端可以接着使用GET方法去请求首部
Location
里的URI。

307 : 对于POST请求,表示请求还没有被处理,客户端应该向首部
Location
里的URI重新发起POST请求。

总的来说,303和307状态码的出现还是在于POST一类操作的非幂等性,不过现在很多服务都还是走302跳转,303和307的几乎没怎么见到过。

大晚上迷迷糊糊打了几行字,有错误的地方欢迎批评指正!

同步更新站点:www.zhenchao.org
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息