node.js学习10--http模块-实现post接口功能

http模块-实现post接口功能

post接口

假设现在要实现一个post类型的接口。具体要求如下:

地址:/post

功能:获取用户传入的参数,并以json字符串格式返回,在返回的信息中要加上时间戳。

示例

接口地址:localhost:8080/post
参数:name=filex&age=30;
返回:{name:filex,age:30,_t:1563265441778}
要求:通过postman软件的测试

post类型与get类型的接口区别较大,主要在两个方面:

  1. 类型不同

    对于类型不同还比较好判断,可以通过 req.method 来获取

  2. 传参不同

    • get请求参数在请求行中(附加在url后面)
    • post请求参数在请求体

对于获取post参数就相对复杂一些,主要是用到request对象的两个事件data,end。

基本流程

  1. 在req对象上添加两个事件,用来收集参数

    1. req.on(“data”,function(chunk){ })

      每次收到一部分数据就会触发一次data事件,回调函数也会相应的执行一次。其中的chunk是一个形参(可以自定义参数名),它是一个buffer。

    2. req.on(“end”,function(){})
      参数全部上传完成之后,会触发end事件。

  2. 解析参数

    1. 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));
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值