基础 - 响应报文结构介绍 ¶
作者:KK
发表日期:2017.9.11
报文样本 ¶
以请求http://www.kkh86.com/it/demo/js/check-all.html这个地址为例,根据《Fiddler - 基础抓包》里抓来的通讯数据包可以看到,请求后服务器发回来的响应数据包是这个模样的:
HTTP/1.1 200 OK
Date: Mon, 11 Sep 2017 07:22:11 GMT
Server: Apache
Last-Modified: Thu, 07 Sep 2017 13:18:09 GMT
ETag: "2d9-558994ab02e80-gzip"
Accept-Ranges: bytes
Vary: Accept-Encoding
Content-Length: 729
Connection: close
Content-Type: text/html
<html>
</head>
<meta charset="UTF-8">
<title>实现全选反选</title>
<script>
function checkAll(){
var chkCheckAll = document.getElementById('chkCheckAll'),
cuisineList = document.getElementsByClassName('cuisine');
for(var i = 0; i < cuisineList.length; i++){
cuisineList[i].checked = chkCheckAll.checked;
}
}
</script>
</head>
<body>
<ul>
<li>
<input type="checkbox" class="cuisine"/>白菜
</li>
<li>
<input type="checkbox" class="cuisine"/>红菜
</li>
<li>
<input type="checkbox" class="cuisine"/>黑菜
</li>
</ul>
<input type="checkbox" id="chkCheckAll" onchange="checkAll()"/>
<label for="chkCheckAll" style="cursor:pointer">全选</label>
</body>
</html>
图解 ¶
这就是响应报文,和请求报文几乎一样,主要有三部分组成:
第一部分:状态行 ¶
内容结构是这样的:HTTP版本 响应状态码 响应消息
响应消息并不是固定的,编程语言也可以自定响应消息,只是我们通常都不修改这些消息所以看着相对固定而已
我工作5年来常见的状态码有如下:
200
:响应消息通常为OK两个字母,表示请求成功301
:响应消息通常为Moved Permanently,表示永久重定向,并在Location响应头中附带一个新的地址,表示以后当前地址要废弃了,内容将迁移到新地址。例如一个网站的“联系我们”页面本来是 /about 这样的,但后来改成了 /about.html 就要这样用了,毕竟可能百度收录了 /about 这个地址,要做这样重定向来告诉搜索引擎“你收录新地址吧”302
:响应消息通常为Found,表示临时重定向,比如检查到用户未登录,要跳去登录页面400
:响应消息通常为Bad Request,表示损坏的请求,简单地理解就是不完整的,缺少了必须的东西的401
:响应通常消息为Unauthorized,表示服务器要对请求端发起身份认证(类似要求登录),通常是发起BaseAuth这个认证,不了解BaseAuth的同学可以参考《Apache2.4 - 常用基础 - http基本认证》403
:响应消息通常为Forbidden,表示无权访问,以下2种情况会导致403请求地址指向了一个目录,但又没有索引文件(index.html index.htm index.php index.jsp等等)
请求地址也是指向了一个目录(Linux系统),虽然有索引文件,但是http服务器的用户(比如www或apahce)无权读取这个目录,通常你一看这些目录的拥有者会发现可能是root用户
404
:响应消息通常为Not Found,表示你懂的……405
:响应消息通常为Method Not Allowed,表示这个请求地址不允许这样的请求方法,比如服务端可以限制 /login.do 必须用POST方法,如果用GET、PUT、DELETE等方法就返回405表示不允许500
:响应消息通常为Internal Server Error,表示服务器出问题了,实际上精确地说往往是程序出问题,只是程序也在服务器上呀……502
:响应消息通常为Bad Gateway,表示充当网关或代理的服务器,从远端服务器接收到了一个无效的请求。比如你请求C的时候,数据会经过B(网关或代理),B帮你发给C的时候C返回了个无效的响应数据的意思吧,我暂时是这么理解503
:响应消息通常为Service Unavailable,服务器繁忙(并发暴满?)的时候最容易出现这个情况
第二部分:响应头 ¶
这个跟请求头一样的结构,关于里面的各个头后面再开文章专门讲,平时见多了你也熟悉
第三部分:响应正文 ¶
如果是请求HTML就是返回HTML代码,否则就是JS、CSS、图片二进制数据什么的,一般会与响应头里面的Content-type
对应,如果不对应,客户端可能无法正常解析
响应正文并不是必然会有的,比如301、302重定向这样的响应就不会有了