构建Web服务器
文章目录
一、HPPT信息
(1) 通用头信息(General)
- Request URL 请求的URL,向服务器端获取的内容
- Request Method 请求的方法,GET或POST
- Status Code 响应的状态码
- Remote Address 请求服务器的IP地址和端口号
状态码 分类:
200系列 : 服务器成功响应
300系列 : 响应的重定向, 跳转另一个URL
400系列 : 客户端错误
500系列 : 服务器错误
(2) 响应头信息(Response Headers)
- Connection 连接方式
- Content-Type 响应文件类型
- Transfer-Encoding 响应时的传输方式
(3) 请求头信息(Request Headers)
- Accpet 客户端接受的文件类型汇总
- Connection 客户端和服务器端的连接方式
- User-Agent 客户端使用的浏览器
二、HTTP模块
可模拟浏览器向服务器端发送请求,也可创建Web服务器
(1) 模拟浏览器
const http = require('http');
http.get('http://www.baidu.com/index.html',(res)=>{
//res:响应的对象
console.log(res.statusCode);//打印状态码
//获取服务器端响应的数据
res.on('deat',(buf)=>{
//on('data'(buf)=>{}):当有数据传递时触发函数,buf接收响应数据
consol.log(buf);
});
});
(2) 创建Web服务器
const http = require('http');
//创建web服务器
var server = http.createServer();
//分配端口,监听端口
server.listen(3000,()=>{
console.log("Web服务器创建成功!");
});
server.on('request',(req,qes)=>{
//request,请求信息
//req,请求的对象
//res,响应的对象
console.log(req.url);
//设置响应内容
res.writeHead(302,{
Location:'http://www.baidu.com'
});
//响应结束
res.end();
});
三、Express框架
Express框架是基于Nodejs来编写,用于构建Web服务器的
3.1 Express框架网址
3.2 路由
浏览器向Web服务器发送请求,Web服务器会根据请求的URL与请求的方法(GET、POST)来做出响应。
客户端登录与服务端响应案例
- login.html
<!DOCTYPE html>
<html>
<head>
<meta charset='utf-8'>
<title>Login</title>
</head>
<body>
<h2>登录</h2>
<!--<form method="post" action="/login">-->
<form method="get" action="/login">
用户:<input type="text" name="user"></br>
密码:<input type="text" name="paw"></br>
<!-- 密码:<input type="password" name="paw"> -->
<input type="submit">
</form>
</body>
</html>>
form表单 : 用于表单的提交来向服务器发送请求,配合tppe="submit"提交按钮使用
method属性 : 向服务器请求的方法(post / get)
action属性 : 向服务器请求的URL。如 /index.html
name属性 : 设置服务器端接受数据的名称
- Server.js
const express = require('express');
const querystring = require('queryString');
var server = express();
//设置端口
server.listen(3000);
//使用get方法
server.get('/login',(req,res)=>{
//响应页面文件
res.sendFile(__dirname+'/index.html');//目录路径+文件名
});
/*使用post方法
server.post('/login',(req,res)=>{
req.on('data',(buf)=>{
var Str = buf.toString();
var obj = querystring.parse(Str);
});
res.sendFile(__dirname+'/index.html');//目录路径+文件名
});
*/
/*使用路由传参方法
server.get('/login/:uid',(req,res)=>{//uid用于接受数据
var obj = req.params();//将路由传进数据转为对象
res.sendFile(__dirname+'/index.html');//目录路径+文件名
});
*/
req.method : 获取请求方法
req.url : 获取请求的URL
req.headers : 获取请求头信息
req.query : 获取请求式,用查询字符串传递数据,返回对象
req.params : 获取路由传递的数据,返回对象res.send( ) : 发送文本,只能响应一次,若是数字则为状态码
res.sendFile( ) : 发送文件,需要以绝对路径__dirname+’/文件名称’
res.redirect( ) : 响应重定向get请求 : 以查询字符串形式传递数据,服务器获取的结果为对象
post请求 : 通过表单提交方法传递数据,服务器端通过事件形式获取数据
3.3 路由器
路由在使用过程中,不同的模块可能出现相同的URL,这时把同一个模块下的所有路由挂载到特定的前缀。路由器是一种自定义模块(js文件),把同一个模块下的路由放在一起。
- 商品模块与用户模块案列
商品模块(product):URL: /product/list
用户模块(user): URL: /user/list /user/password
- Product.js
//商品路由器
const express = require('express');
//创建空路由器
var router = express.Router();
//将商品模块下的路由添加到路由器中
router.get('/list',(req,res)=>{
res.send("商品list");
});
//导出路由器
module.exports = router;
- User.js
//用户路由器
const express = require('express');
//创建空路由器
var router = express.Router();
//将商品模块下的路由添加到路由器中
router.get('/list',(req,res)=>{
res.send("用户list");
});
router.get('/password',(req,res)=>{
res.send("用户password");
});
//导出路由器
module.exports = router;
- Server.js
const express = require('express');
//引入Product.js
const prodRouter = require('./Product.js');
const userRouter = require('./User.js');
var server = express();
server.listen(3000);
//将路由器挂载到product下
server.use('/product',proRouter);
//将路由器挂载到user下
server。use('/user',userRouter);
3.4 中间件
中间件的作用是为主要业务逻辑服务,每个中间件是一种函数。可分为应用级中间件,路由级中间件,内置中间件,第三方中间件,错误级中间件。
- 应用级中间件:每个中间件是一个函数,需要配合其他中间件或路由使用
- 登录注册案例
const express = require('express');
var server = express();
server.listen(3000);
//验证-注册中间件
server.use('/reg',(req,res,next)=>{
//next参数: 调用下一个中间件,或进入业务逻辑
console.log('启动验证中间件');
next();
});
//注册路由
server.get('/reg',(res,req,next)=>{
res.send('注册成功!');
next();
});
//登录路由
server.get('/login',(res,req)=>{
res.send('登录成功!');
next();
});
//登录-记录日志中间件
server.use('/login',(req,res)=>{
console.log("记录日志");
});
- 内置中间件:资源文件托管指定目录,浏览器请求资源则在该目录下查找
-
静态文件案例
-
public目录:包含login.html、reg.html
-
static.js
const express = require('express');
var server = express();
server.listen(3000);
//托管静态资源
server.use(express.static(./public));
/*
* 在浏览器输入: http://127.0.0.1:3000/reg.html
* 即可响应public目录下的reg.html文件
*/