http模块中request(http.IncomingMessage 类) 和 response(http.ServerResponse 类) 对象介绍
request:服务器解析用户提交的 http 请求报文, 将结果解析到 request对象中,凡是要获取和用户请求相关的数据,都可以通过request对象获取
response:在服务器端用来向用户做出响应的对象,凡是需要向用户(客户端)响应的操作,都是需要response对象进行
一、request对象常用的属性
request.headers:获取所有请求报文头,返回的是一个对象,这个对象中包含了所有的请求报文头
request.rawHeaders:获取所有请求报文头 返回的是一个数组,数组中保存的都是请求报文头的字符串
request.httpVersion:获取请求客户端所使用的http版本
request.method:获取客户端请求使用的方法(POST、GET、PUT、DELETE等)
request.url:获取这个请求的路径(获取请求报文中的请求路径,不包含主机名称、端口号、协议)
const http = require('http');
http.createServer((req, res) => {
console.log('req.headers返回的是一个对象:');
console.log(req.headers);
console.log('req.rawHeaders返回的是一个数组:');
console.log(req.rawHeaders);
console.log('req.httpVersion 获取请求客户端所使用的http版本:');
console.log(req.httpVersion);
console.log('req.method 获取客户端请求使用的方法(POST、GET、PUT、DELETE等):');
console.log(req.method);
console.log('req.url 获取这个请求的路径:');
console.log(req.url);
res.end('over');
}).listen(8080, () => {
console.log('http://localhost:8080');
});
node命令运行上面代码会输出两遍,是因为发送了两个请求:
二、response对象常用的属性和方法
(1)response.write()
response.write()会发送一块响应主体;可被多次调用,以便提供连续的响应主体片段。
(2)response.end()
response.end()会通知服务器,所有响应头和响应主体都已被发送,即服务器将其视为响应已完成。
每次响应都必须调用 response.end() 方法,否则,客户端会一直等待服务器响应完成。
response.end([data][, encoding][, callback]) 中有三个可选参数,第一个参数是响应的数据(数据类型只能是string或Buffer类型的),第二个参数指定响应的数据的编码方式,第三个参数是一个回调函数(在响应结束后调用)
如果指定了 data,则相当于调用 response.write(data, encoding) 之后再调用 response.end(callback)。
res.end('Hello World!!!');
等价于
res.write('Hello World!!!');
res.end();
(3)response.setHeader()
设置响应报文头
response.setHeader()必须放在 response.write() 和 response.end() 之前设置
因为即使我们不设置响应报文头,系统也会默认有响应报文头,并且默认发送给浏览器,当已经发送过响应报文头,就不能再设置了,否则就会报错
(4)response.statusCode
设置http响应状态码
(5)response.statusMessage
设置http响应状态码对应的消息
response.statusCode和response.statusMessage也必须放在 response.write() 和 response.end() 之前设置
res.statusCode = 404;
res.statusMessage = 'Not Found!';
res.setHeader('Content-Type', 'text/plain; charset=utf-8');
(6)response.writeHead()
发送一个响应头给请求。
response.writeHead(statusCode[, statusMessage][, headers])
第一个参数必有,设置http响应状态码;第二个参数可选,设置http响应状态码对应的消息;第三个参数可选,是一个对象,设置响应头;该方法在消息中只能被调用一次;也必须放在 response.write() 和 response.end() 之前设置。
res.writeHead(404, 'Not Found!', {'Content-Type': 'text/plain; charset=utf-8'});
等价于
res.statusCode = 404;
res.statusMessage = 'Not Found!';
res.setHeader('Content-Type', 'text/plain; charset=utf-8');
注意:每个请求都会调response.writeHead() 这个方法,只不过我们不写的时候,系统会默认调用这个方法发送请求头。
response.statusCode设置的状态码、response.statusMessage设置的状态码对应的消息以及response.setHeader() 设置的响应头会与 response.writeHead() 设置的响应头合并,且 response.writeHead() 的优先。
例如:
const http = require('http');
http.createServer((req, res) => {
res.statusCode = 200;
res.statusMessage = 'ok';
res.setHeader('Content-Type', 'text/html; charset=utf-8');
res.writeHead(404, 'Not Found!', {'Content-Type': 'text/plain; charset=utf-8'});
res.write('Hello, 小明!');
res.end();
}).listen(8080, () => {
console.log('http://localhost:8080');
});