基础 - 响应报文结构介绍

  • 作者: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

    1. 请求地址指向了一个目录,但又没有索引文件(index.html index.htm index.php index.jsp等等)

    2. 请求地址也是指向了一个目录(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重定向这样的响应就不会有了