1 报文
- 用于 HTTP 协议交互的信息被称为 HTTP 报文
- HTTP 报文本身是由多行(用 CR+LF 作换行符)数据构成的字符串文本
1.1 请求报文和响应报文的结构
- 请求行
包含用于请求的方法,请求 URI 和 HTTP 版本。 - 状态行
包含表明响应结果的状态码,原因短语和 HTTP 版本。 - 首部字段
包含表示请求和响应的各种条件和属性的各类首部。一般有 4 种首部,分别是:通用首部、请求首部、响应首部和实体首部。 - 其他
可能包含 HTTP 的 RFC 里未定义的首部(Cookie 等)
1.2 内容编码
常用的内容编码有以下几种。
- gzip(GNU zip)
- compress(UNIX 系统的标准压缩)
- deflate(zlib)
- identity(不进行编码)
分割发送的 分块传输编码
在传输大容量数据时,通过把数据分割成多块,能够让浏览器逐步显示页面
1.3 获取部分内容的分块请求
- 下载过程中遇到网络中断的情况,那就必须重头开始。为了解决上述问题,需要一种可恢复的机制。所谓恢复是指能从之前下载中断处恢复下载
- 要实现该功能需要指定下载的实体范围。像这样,指定范围发送的请求叫做范围请求(Range Request)
1.4 内容协商返回最合适的内容
当浏览器的默认语言为英语或中文,访问相同 URI 的 Web 页面时,则会显示对应的英语版或中文版的 Web 页面。这样的机制称为内容协商
2 抓包
网页可以伪造请求,比如cookies获得之后,可以使用这个cookies伪造请求发送给服务器
3 HTTP状态码
状态码类型:
3.1 2XX 成功
表明请求被正常处理了。
- 200 OK
正常处理并返回对应资源 - 204 No Content
- 请求收到了,但是没给响应内容,只给响应头,那么浏览器显示的页面
不发生更新 - 一般在只需要从客户端往服务器发送信息,而对客户端不需要发送新信息内容的情况下使用
- 请求收到了,但是没给响应内容,只给响应头,那么浏览器显示的页面
- 206 Partial Content
客户端进行了范围请求,返回一部分资源
3.2 3XX 重定向
- 301 Moved Permanently:永久性重定向,这次重定向之后会被记录在浏览器,以后打开同样网址会直接重定向(不必发送给服务器)
像下方给出的请求 URI,当指定资源路径的最后忘记添加斜杠“/”,就
会产生 301 状态码。
http://example.com/sample - 302 Found:临时性重定向,每次都要发送请求给服务器,服务器才会重定向
- 304 Not Modified 缓存
3.3 4XX 客户端错误
表明客户端是发生错误的原因所在
- 400 Bad Request:该状态码表示*请求报文中存在语法错误
- 401 Unauthorized:需要用户授权(以前)
- 403 Forbidden:该状态码表明对请求资源的访问被服务器拒绝了
没有权限 - 404 Not Found:表明服务器上无法找到请求的资源,url出错
3.4 5XX 服务器错误
表明服务器本身发生错误
- 500 Internal Server Error:表明服务器端在执行请求时发生了错误
- 503 Service Unavailable:表明服务器暂时处于超负载或正在进行停机维护,现在无法处理请求
3.5 状态码和状况的不一致
- 不少返回的状态码响应都是错误的,但是用户可能察觉不到这点。
- 比如 Web 应用程序内部发生错误,状态码依然返回 200 OK,这种情况也经常遇到。
4 node.js 写一个简单服务器
302
let http = require('http');
let server = http.createServer(function(req, res) {
console.log(req.headers);
console.log(req.url);
res.statusCode = 302;
// res.statusMessage = 'supercll';
res.setHeader('location', 'http://www.lhikari.com/');
res.end('hello world');
})
server.listen(3000);
301
let http = require('http');
let server = http.createServer(function(req, res) {
console.log(req.headers);
console.log(req.url);
res.statusCode = 301;
// res.statusMessage = 'supercll';
res.setHeader('location', 'http://www.lhikari.com/');
res.end('hello world');
})
server.listen(3000);
先访问一次本地ip之后,断掉nodejs写的服务器
再次访问本地地址
仍然是跳转连接,说明此次请求并未传到服务器,而是直接跳转,保存在浏览器的缓存中,这就是301与302的区别
4xx
let server = http.createServer(function(req, res) {
console.log(req.headers);
console.log(req.url);
res.statusCode = 404;
// res.statusMessage = 'supercll';
// res.setHeader('location', 'http://www.lhikari.com/');
res.end('hello world');
})
server.listen(3000);
会报错,但是页面仍会渲染,因为服务器实际上是接受了请求并返回响应了,只是找不到对应的路径。
500
let http = require('http');
let server = http.createServer(function(req, res) {
console.log(req.headers);
console.log(req.url);
res.statusCode = 500;
res.setHeader('Content-Type', 'text/plain; charest=utf-8')
res.end('<h1>hello world</h1>');
})
server.listen(3000);
此时服务端叫浏览器按照响应头设置的html模式来渲染,但是浏览器自作主张按照字符串去渲染了