文章目录

  • Node中的Http
  • 一、HTTP服务器
    • 1.http.server事件
    • 2.http.ServerRequset请求信息
    • 3.获取GET请求内容
    • 4.获得POST请求内容
    • 5.http.ServerResponse返回客户端信息
    • 6. 响应乱码
    • 7. 不同地址响应不同内容
  • 二、Express 框架
    • 2.1Express框架是什么
    • 2.3Express 框架特性
    • 2.4基本使用(入门代码)
    • 2.5express的get和post请求
    • 2.6获取请求参数
      • (1)req.query
    • 2.7获取动态参数

Node中的Http

  • Node中提供了http模块,其中封装了高效的http服务器和http客户端
  • http.Server是一个基于事件的http服务器,内部是由c++实现的,接口是由JavaScript封装
  • http.request是一个http客户端工具。 用户向服务器发送数据。

一、HTTP服务器

http.Server实现的,它提供了一套封装级别很低的API,仅仅是流控制和简单的解析,所有的高层功能都需要通过它的接口,就像在前面的文章《Node入门必须知道的事情》中创建的服务器一样是特别的简单的。

1.http.server事件

HTTP服务器的所有功能,它继承自EventEmitter,提供了以下的事件:

  1. request:当客户端请求到来的时候,该时间被触发,提供两个参数request 和 response,分别是http.ServerRequest 和 http.ServerResponse 表示请求和响应的信息

  2. connection:当TCP建立链接的时候,该时间被处罚,提供了一个参数 socket ,为net.socket的实例(底层协议对象)

  3. close:当服务器关闭的时候会被触发

  4. 除此之外还有 checkContinue、upgrade、clientError等事件

    我们最常用的还是request事件,http也给这个事件提供了一个捷径:http.createServer([requestListener])

使用request事件的案例:

const http = require('http');
function  a(){console.log("dajiahao");
}
var server = new http.Server();
server.on('request',(req,res)=>{console.log(req.url);//设置应答头信息res.writeHead(200,{'Content-Type':'text/html'});res.write('hello we are family<br>');res.end('server already end\n');
});
//显示了三次这也证明了TCP的三次握手
server.on('connection',()=>{a();
});
server.on('close',()=>{console.log('server will close');
});
//关闭服务为了触发close事件
server.close();
server.listen(80);

使用http的给的捷径http.createServer制作的代码:

const http = require('http');
http.createServer(function(req,res){res.writeHead(404,{'Content-Type':'text/plain'})res.write("we are is content");res.end("fdsa");
}).listen(3000);

2.http.ServerRequset请求信息

我们都知道HTTP请求分为两部分:请求头和请求体,如果请求的内容少的话就直接在请求头协议完成之后立即读取,请求体可能相对较长一点,需要一定的时间传输。因此提供了三个事件用于控制请求体传输.

(1)data:当请求体数据到来时,该事件被触发,该事件一共一个参数chunk,表示接受到的数据。
(2)end:当请求体数据传输完成时,该事件被触发,此后将不会再有数据到来。
(3)close:用户当前请求结束时,该事件被触发,不同于end,如果用户强制终止了传输,也会触发close

ServerRequest的属性

名称 含义
ccomplete 客户端请求是否已经发送完成
HttpVersion HTTP协议版本,通常是1.0或1.1
httpVersion HTTP协议版本,通常是1.0或1.1
method HTTP请求方法,如:GET,POST
url 原始的请求路径
headers HTTP请求头
trailers HTTP请求尾(不常见)
connection 当前HTTP连接套接字,为net.Socket的实例
socket connection属性的别名
client client属性的别名
http.createServer(function(req,res){console.log(req.httpVersion);//console.log(req.socket);console.log(req.headers);console.log(req.method);res.writeHead(404,{'Content-Type':'text/plain'})res.write("we are is content");res.end("fdsa");
}).listen(80);

3.获取GET请求内容

由于GET请求直接被嵌入在路径中,URL完整的请求路径,包括了?后面的部分,因此你可以手动解析后面的内容作为GET的参数,Nodejs的url模块中的parse函数提供了这个功能

const http = require("http");
const server = http.createServer();
server.on("request", (req, res) => {console.log(req.url); //获取请求地址console.log(req.method); //获取请求方式
});
server.listen(80, () => {console.log("server is listen:127.0.0.1");
});

4.获得POST请求内容

POST请求的内容全部都在请求体中,http.ServerRequest并没有一个属性内容为请求体,原因是等待请求体传输可能是一件耗时的工作。譬如上传文件。恶意的POST请求会大大消耗服务器的资源。所以Nodejs是不会解析请求体,当你需要的时候,需要手动来做。
简单的看一下代码:

const http = require('http');
const net  = require('net');
const url  = require('url');
const util = require('util');
//querystring用于处理URL中的查询字符串
const querystring = require('querystring');http.createServer((req,res)=>{var posr = '';req.on('data',(chunk)=>{post+=chunk;});res,on('end',()=>{//将字符串变为json的格式post  =  querystring.parse(post);//向前端返回字符串res.end(util.inspect(post));});
})

5.http.ServerResponse返回客户端信息

决定了用户最终能到的结果,它是由http.Server的request事件发送的,作为第二个参数传递。一般为response或res

主要的三个函数:

response.writeHead(statusCode,[headers]):向请求的客户端发送响应头。

statusCode是HTTP的状态码,如200为成功,404未找到等。

headers是一个类似关联数组的对象,表示响应头的每个属性。

response.write(data,[encoding]) 向请求客户端发送相应内容,data是buffer或字符串,encoding为编码

response.end([data],[encoding]) 结束响应,告知用户所有发送已经完成,当所有要返回的内容发送完毕,该函数必须被调用一次,如果不调用,客户端永远处于等待状态

6. 响应乱码

服务器给客户端响应内容的时候有的时候由于编码格式会显示乱码,我们设置如下:

const http = require("http");
const server = http.createServer();
server.on("request", (req, res) => {res.setHeader("Content-Type", "text/html;charset=utf-8");res.end(req.url + req.method);
});
server.listen(80, () => {.....
});

7. 不同地址响应不同内容

const http = require("http");
const server = http.createServer();
server.on("request", (req, res) => {let content = "";if (req.url == "/" || req.url == "/index.html") {content = "<h1>首页内容</h1>";} else if (req.url == "/detail.html") {content = "<h1>详情页内容</h1>";} else {content = "<h1>你访问的页面不存在</h1>";}res.setHeader("Content-Type", "text/html;charset=utf-8");res.end(content);
});
server.listen(80, () => {console.log("server is listen:127.0.0.1");
});

二、Express 框架

2.1Express框架是什么

Express 是一个基于Node平台的web应用开发框架,它提供了一系列的强大特性,帮助你创建各种web应用

下载

npm install express@4.17.1

2.3Express 框架特性

  • 提供了简洁的路由定义方式
  • 对获取http请求参数进行简化处理
  • 模板引擎支持程度高,方便渲染动态HTML页面
  • 拥有中间件机制有效控制http请求
  • 拥有大量第三方中间件功能进行扩展

2.4基本使用(入门代码)

// 引入 express 框架
const express = require('express')
// 创建网站服务器
const app = express();app.get('/', (req, res) => {// send()// 1. send 方法内部会检测响应内容的类型// 2. send 方法会自动设置 http 状态码// 3. send 方法还会帮我们自动设置响应的内容类型以及编码res.send('Hello Express');
})
app.get('/list', (req, res)=> {// 向客户端直接响应一个对象 res.send({name: 'zhangsan', age: 20});
})
// 监听端口
app.listen(80);
console.log('网站服务器启动成功');

2.5express的get和post请求

const express = require("express");
const app = express();
// 发送get请求
app.get("/user", (req, res) => {res.send({ code: 200, msg: "响应get请求成功", status: 1 });
});
// 发送get请求
app.post("/user", (req, res) => {res.send({ code: 200, msg: "响应post请求成功", status: 1 });
});
app.listen(80, () => {console.log("服务已经启动127.0.0.1");
});

通过postman来测试

2.6获取请求参数

(1)req.query

req.query可以获取客户端请求的参数

// 引入 express 框架
const express = require('express');
// 创建网站服务器
const app = express();app.get('/index', (req, res) => {let msg =req.query //获取请求参数res.send({ code: 200, msg: msg.query, status: 1 });
})// 监听端口
app.listen(3000);
console.log('服务器开启成功');

postman测试127.0.0.1/user?name=tom&age=23,结果如下:

{"code": 200,"msg": {"name": "tom","age": "23"},"status": 1
}

2.7获取动态参数

req.params 动态获取参数

// 引入 express 框架
const express = require('express');
// 创建网站服务器
const app = express();app.get("/user/:id/:name", (req, res) => {let msg = req.params;res.send({ code: 200, msg: msg, status: 1 });});// 监听端口
app.listen(80);
console.log('服务器开启成功');

postman测试:127.0.0.1/user/1/tom,响应结果如下:

{"code": 200,"msg": {"id": "1","name": "tom"},"status": 1
}

Node中HTTP模块相关推荐

  1. 第二章. node中的模块和require

    2019独角兽企业重金招聘Python工程师标准>>> 一 什么是模块. JavaScript诞生初,它只不过是一个网页的小脚本而已,没有人会想到它会发展到现在能有大量的库,工具,组 ...

  2. 使用node中fs模块创建和删除文件夹

    创建文件夹 假如我们要创建这样一个文件夹'a/d/c/d/e' 同步创建文件夹 let fs = require('fs'); function makep(dir) {let paths = dir ...

  3. node.js中模块_在Node.js中需要模块:您需要知道的一切

    node.js中模块 by Samer Buna 通过Samer Buna 在Node.js中需要模块:您需要知道的一切 (Requiring modules in Node.js: Everythi ...

  4. node中模板引擎、模块导出、package.json简介

    在node.js中使用引擎模板: art-template不仅在浏览器可以使用,也可以在node中使用,并且模板引擎起早诞生于服务器领域,在node中使用模板引擎: 1.安装:在一个文件目录下执行命令 ...

  5. nodejs中的模块系统:exports导出模块

    node中的模块系统 示例: 模块作用域 成功获取add: module.exports

  6. 动手编写Node的C++模块

    作者: JeremyWei | 可以转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明 网址: http://it.taocms.org/01/2540.htm.html 介绍 Node( ...

  7. node中模块、AMD与CMD、ES6模块,node中使用ES6

    1.Nodejs 中的模块 在node环境中一个js文件就是一个模块(module) 我们采用的是CommonJS规范,使用require引入模块,使用module.exports导出接口 node的 ...

  8. node 的path模块中 path.resolve()和path.join()的区别

    一.path模块的引入. 直接引用.node中自带的模块 const path = require('path'); 二.path.join(path1,path2,path3-) 作用: 将路径片段 ...

  9. Node 中的path模块

    参考文档:https://nodejs.org/docs/latest-v13.x/api/path.html path模块中的常用API: path.basename:获取路径的文件名,默认包含扩展 ...

最新文章

  1. python ln2怎么写_Python2和3切换默认
  2. SpaceX再送4人上太空,马斯克保证这次飞船厕所不会漏了
  3. 关于TCP和MQTT之间的转换
  4. Leetcode题库 6.Z字形变换(C实现)
  5. aodv协议C语言代码,AODV协议的运行方式
  6. php iframe 上传文件,php+iframe 实现上传文件功能示例
  7. 【C++】 67_经典问题分析 五
  8. bzoj3550: [ONTAK2010]Vacation1283: 序列
  9. JSP Cookie 处理
  10. 苹果 5G 掉队?!
  11. day01:关于惯性导航工具箱的学习与使用:use of the progen
  12. 字符串的迷之算法——KMP,AC自动机,后缀数组
  13. 强力推荐!五款能让你成为Excel“高手”的Excel插件
  14. 你不知道的javaScript读书笔记(六)
  15. JavaScript补齐指定位数
  16. CSDN邀您加入GitChat,让知识变现!
  17. 马云创造阿里巴巴帝国秘诀
  18. 青藤:容器安全成熟度验证标准之3个层级,12大场景,100+ Checklist
  19. 敏捷团队要有一个《伊凡卡目标》——计划会的共识和每日站会的焦点
  20. 「后以太坊1.0」众生相:DeFi拥堵,突围Layer2

热门文章

  1. Monte Calro Tree Search (MCTS)
  2. npm 安装 webpack
  3. URL地址拼接中文乱码
  4. javascript 面向对象-面试题实例
  5. 期货原油交割注意事项(原油期货怎么交割)
  6. 时尚杂志女装搭配很好看 学好这几招不用愁
  7. leetcode292. Nim 游戏(java python3)
  8. findIndex与indexOf 的区别
  9. Github最火!程序员必须知道22大定律和法则
  10. 前端:一篇彻底搞懂vuex (mapState、mapGetters、mapMutations、mapActions)