http模块-实现post接口功能
post接口
假设现在要实现一个post类型的接口。具体要求如下:
地址:/post
功能:获取用户传入的参数,并以json字符串格式返回,在返回的信息中要加上时间戳。
示例
:
接口地址:localhost:8080/post
参数:name=filex&age=30;
返回:{name:filex,age:30,_t:1563265441778}
要求:通过postman软件的测试
post类型与get类型的接口区别较大,主要在两个方面:
-
类型不同
对于类型不同还比较好判断,可以通过 req.method 来获取
-
传参不同
- get请求参数在请求行中(附加在url后面)
- post请求参数在
请求体
中
对于获取post参数就相对复杂一些,主要是用到request对象的两个事件data,end。
基本流程
:
-
在req对象上添加两个事件,用来收集参数
-
req.on(“data”,function(chunk){ })
每次收到一部分数据就会触发一次data事件,回调函数也会相应的执行一次。其中的chunk是一个形参(可以自定义参数名),它是一个buffer。
-
req.on(“end”,function(){})
参数全部上传完成之后,会触发end事件。
-
-
解析参数
- queryString,使用querystring模块取出具体的参数值。
示例代码
:
// 引入http模块
const http = require('http');
// 引入url模块
const url = require('url');
// 引入querystring模块
const queryString = require('querystring');
// 创建http服务
const server = http.createServer(function(req, res) {
var { pathname } = url.parse(req.url);
if (pathname === '/post' && req.method === 'POST') {
let data = '';
req.on('data', chunk => {
data += chunk;
});
req.on('end', () => {
res.setHeader('content-type', 'application/json');
var str = { ...queryString.parse(data), d: Date.now() };
// 把对象转成字符串之后再返回
res.end(JSON.stringify(str));
});
} else {
res.setHeader('content-type', 'text/html;charset=utf-8');
res.end('error');
}
});
// 监听端口
server.listen(8088, function() {
console.log('success', 8088);
});
在发送post请求时,传递的数据会在请求体中,是字符串格式,并且是一点一点上传到web服务器的(是积小成多,而不是一蹴而就)每上传一部分就会触发一次data事件,等到最后全部上传完成之后,会触发end事件。
下面是一个示例代码,用来模拟使用post请求发送大量的数据,以观察req.on(‘data’, chunk => {})多次触发的现象。
var xhr =new XMLHttpRequest();
xhr.open('post','http://localhost:8080/post');
xhr.setRequestHeader('content-type','application/x-www-form-urlencoded');
xhr.send("name="+"imissyou".repeat(100000));