前言
http是前端特别熟悉的概念,而且经常和后端请求数据。有了http模块之后,我们就可以自己起一个服务,甚至都不需要后端就能完成一些demo了。在node.js中,http模块是一个很复杂,也是一个很核心的模块。我们我篇文章就主要从客户端和服务端的角度介绍http模块。
http服务
http服务是在服务端和客户端之间完成的。
- 客户端client: 向服务端发起请求,获取服务器返回的内容
- 服务端server: 接收客户端的请求,处理请求并将结果返回给客户端。
这篇文章主要是介绍Node.js中http模块的用法,对于请求头,请求体,响应头,响应体的具体内容在这里就不展开介绍了,感兴趣的可以参考我的前端路线专栏中关于http的介绍的文章。
1. http请求
http请求是在req对象上的,关于请求,服务端和客户端分别要完成以下事情。
- 服务端:获取请求方的信息,如请求头等
- 客户端:发送请求。
1.1 服务端
对于服务端来说,当然是创建服务了,整个主要是通过http的createServer来实现的
const http = require('http');
// 创建一个服务
const server = http.createServer((req, res) => {
console.log('请求头', req.headers);
res.end('请求成功');
});
server.listen(3000);
对于服务点来说,以下几个主体特别重要
- server: http.Server实例,用来提供服务,处理客户端的请求
- req: http.IncomingMessage实例。serverReq 用来获取客户端请求的相关信息, 比如请求头,请求体
- res: http.ServerResponse实例,用来设置响应体的内容,请求方法,状态码等
1.2 客户端
对于客户端来说,就是请求服务了,这个我们应该很熟悉。
const client = http.get('http://127.0.0.1:3000', (res) => {
console.log('res', res);
});
对于客户端来说,也有两个很重要的主体。
- client:http.ClientRequest实例,用来向服务端发送请求
- res: 也就是获取响应服务端返回的相关信息, 如响应头,响应体。
http请求服务的应用
对于服务端来说,主要有以下几个应用
1. 获取请求路径/方法/http版本/请求头
获取请求路径/方法/http版本/请求头都是在服务端的req主体里面。 示例
const http = require('http');
// 创建一个服务
const server = http.createServer((req, res) => {
console.log('请求路径', req.url);
console.log('请求方法', req.method);
console.log('http版本', req.httpVersion);
console.log('请求头', req.headers);
res.end('请求成功');
});
server.listen(3000);
当发起请求时就可以看到以下内容:
2. 获取get请求参数
对于get请求,我们经常会携带一些参数。对于路径拼接的在这类参数,可以通过url的query获取。
const http = require('http');
const url = require('url');
const querystring = require('querystring');
// 创建一个服务
const server = http.createServer((req, res) => {
console.log('请求路径', req.url);
const urlObj = url.parse(req.url);
// 获取query
const query = urlObj.query;
console.log('get请求参数', query);
const queryObj = querystring.parse(query);
console.log( 'get请求参数转化后', JSON.stringify(queryObj) );
res.end('请求成功');
});
server.listen(3000);
通过在浏览器访问http://127.0.0.1:3000/test?name=Tom&age=18 效果如下:
3. 获取post请求参数
post请求需要创建一个表单
<form action="http://127.0.0.1:3000" method="post">
<input type="text" name="name" />
<input type="password" name="pwd" />
<input type="submit" value="按钮" />
</form>
对于post请求的参数,需要给req主体绑定data事件才能拿到
const http = require('http');
// 创建一个服务
const server = http.createServer((req, res) => {
let params = '';
req.on('data', (param) => {
params += param;
})
res.on('end', () => {
console.log('post请求参数', params);
res.end('ok');
})
});
server.listen(3000);
效果如下:
2. http响应
http响应服务主要就是针对服务端的res来进行设置的,我们可以设置状态码,状态描述信息,响应头,响应主体。
1. 设置状态码和描述信息
设置状态码和描述信息可以使用res.writeHead()来设置,也可以使用res.statusCode/res.statusMessage()来实现
const server = http.createServer((req, res) => {
res.writeHead(200, 'true');
res.statusCode = 200;
res.statusMessage = 'true';
res.end('ok');
});
server.listen(3000);
效果如下:
2. 设置响应头
设置响应头可以通过res.writeHead()和res.setHeader()来实现。
const server = http.createServer((req, res) => {
res.writeHead(200, 'true', {
'Content-Type': 'text-plain'
});
res.setHeader('Content-Type', 'text-plain');
res.end('ok');
});
server.listen(3000);
效果如下:
需要注意的是
已经通过 res.setHeader() 设置了header,当通过 res.writeHead() 设置同名header,res.writeHead() 的设置会覆盖之前的设置。
3. 设置响应体
响应体主要可以通过res.write()和res.end()方法来设置
const server = http.createServer((req, res) => {
res.write('ok');
res.end('ok');
});
server.listen(3000);
效果如下:
到目前为止,这篇文章主要介绍http的常见用法,想要了解更加复杂的用法,建议参考Node官网