当前位置: 首页 > news >正文

浅度理解NodeJS的HTTP模块

HTTP模块是NodeJS自带的核心模块,其用法简单,只要创建一个服务器,然后监听端口,整个服务就跑起来啦

let http = require('http');
let server = http.createServer(function(req,res){

});
server.listen(8080);
复制代码

http模块createServer的callback中,
req(request)代表客户端的数据,是一个可读流;
res(response)代表服务端的数据,是一个可写流; 你可以拿到你想要的数据:

let http = require('http');
let server = http.createServer();
server.on('request', function (req, res) {
    let buffers = [];
    req.on('data', function (data) {
        buffers.push(data);
    });
    req.on('end', function () {
        console.log(Buffer.concat(buffers).toString());
        res.write('hello node');
        res.end();
    });
});
复制代码

request事件是监听请求的事件,buffers是用来接收服务端发来的buffer数据,在end的时候console出来。res.write是可写流的write事件,往客户端写数据。当然,在这里我们并不能打印出来buffer因为还少一个请求头部,接下来,我们用代码模拟一下http模块的工作原理,让你一目了然。

服务端的代码和上段代码差不多,只是我们要接收到客户端的数据后用请求头部来判断数据的格式

let http = require('http');
let queryString = require('querystring');
let server = http.createServer();
server.on('request', function (req, res) {
    let contentType = req.headers['content-type'];
    let buffers = [];
    req.on('data', function (chunk) {
        buffers.push(chunk);
    });
    req.on('end', function () {
        let content = Buffer.concat(buffers).toString()
        if(contentType === 'application/json'){
            console.log(JSON.parse(content).name)
        }else if(contentType === 'application/x-www-form-urlencoded'){
            console.log(queryString.parse(content).name)
        }
        res.end('hello node');
    });
});
server.listen(8080);
复制代码

客户端我们把所有请求的头部信息整理成一个json然后用response事件拿到客户端的数据

let http = require('http');
let options = {
    hostname: 'localhost',
    port: 8080,
    path: '/',
    method: 'get',
    // 告诉服务端我当前要给你发什么样的数据
    // headers: {     // json数据格式
    //     'Content-Type': 'application/json',
    //     'Content-Length': 16,     // 传输数据的长度(buffer的长度)
    // },
    headers:{         // 表单数据格式
        'Content-Type':'application/x-www-form-urlencoded',
        'Content-Length':16,
    },
}

let req = http.request(options);
req.on('response',function(res){
    res.on('data',function(chunk){
        console.log(chunk.toString());
    });
});
// req.end('{"name":"haha"}');     // json数据格式
req.end('name=haha&age=18');        // 表单数据格式
复制代码

然后运行服务端文件
再用cmd切换到文件所在目录运行客户端文件

node httpClient.js  //客户端文件的名字
复制代码

服务端会打出
{ name: 'haha', age: '18' }
客户端也会打出
hello node
怎么样~
经过这个小例子,是不是对http模块的理解更深了点呢

相关文章:

  • Git的本地仓库与GitHub的远程仓库
  • haproxy+pacemaker高可用负载均衡
  • 剖析RAC中的@weakify、@strongify
  • 解析PE资源表与重定位表
  • BTA | 周政军:区块链中侧链和分片解决不了的扩容问题,交给DAG吧!
  • PHP定时任务Crontab结合CLI模式详解
  • go append函数以及写入
  • mysql错误Table ‘./mysql/proc’ is marked as crashed and should be repaired
  • 于小镭:区块链将从三方面带来颠覆性认知革命
  • xtrabackup备份和还原
  • 什么时候使用HashMap?它有什么特点?
  • html中表格td的宽度如何设置
  • 关于form表单提交ajaxForm和ajaxSubmit的用法与区别
  • content属性为中文时导致html页面乱码问题
  • redis简单操作命令
  • 【划重点】MySQL技术内幕:InnoDB存储引擎
  • GDB 调试 Mysql 实战(三)优先队列排序算法中的行记录长度统计是怎么来的(上)...
  • iOS动画编程-View动画[ 1 ] 基础View动画
  • node 版本过低
  • nodejs实现webservice问题总结
  • php中curl和soap方式请求服务超时问题
  • 关于Java中分层中遇到的一些问题
  • 理清楚Vue的结构
  • 用 vue 组件自定义 v-model, 实现一个 Tab 组件。
  • linux 淘宝开源监控工具tsar
  • ​一文看懂数据清洗:缺失值、异常值和重复值的处理
  • #我与Java虚拟机的故事#连载09:面试大厂逃不过的JVM
  • $jQuery 重写Alert样式方法
  • (13):Silverlight 2 数据与通信之WebRequest
  • (C语言)输入一个序列,判断是否为奇偶交叉数
  • (二)构建dubbo分布式平台-平台功能导图
  • (附源码)ssm学生管理系统 毕业设计 141543
  • (十八)SpringBoot之发送QQ邮件
  • (转)fock函数详解
  • (转)h264中avc和flv数据的解析
  • (转)关于如何学好游戏3D引擎编程的一些经验
  • .NET Core SkiaSharp 替代 System.Drawing.Common 的一些用法
  • .NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划
  • .NET/C# 项目如何优雅地设置条件编译符号?
  • .NET8.0 AOT 经验分享 FreeSql/FreeRedis/FreeScheduler 均已通过测试
  • .NET使用HttpClient以multipart/form-data形式post上传文件及其相关参数
  • .stream().map与.stream().flatMap的使用
  • /etc/motd and /etc/issue
  • @Autowired @Resource @Qualifier的区别
  • [Bzoj4722]由乃(线段树好题)(倍增处理模数小快速幂)
  • [iOS]Win8下iTunes无法连接iPhone版本的解决方法
  • [iphone-cocos2d]关于Loading的若干处理和讨论
  • [JavaWeb学习] Spring Ioc和DI概念思想
  • [LeetCode]Max Points on a Line
  • [oeasy]python0004_游乐场_和python一起玩耍_python解释器_数学运算
  • [p4] Uncheckout other user‘s file?
  • [PTP][1588v2] Delay_Resp消息
  • [Python] scikit-learn中数据集模块介绍和使用案例
  • [python]使用pyqt5搭建yolov8 竹签计数一次性筷子计数系统
  • [Redis源码阅读]当你输入get/set命令的时候,Redis做了什么