04_http模块
HTTP模块
1、概述
1.1、什么是HTTP模块?
- 在回答这个问题之前,我们首先需要回顾一下 什么是客户端,什么是服务端?
- 客户端:负责消耗资源的的计算机,就是客户端
- 服务端:负责提供资源的计算机,就是我们的服务器(端口)
- http模块是nodeJs官方提供的
- 它的目的是让一台普通的计算机,变成一个Web服务器
- 通过http模块提供的.createServer()函数 == (创建服务),完成对Web服务器的创建
- 要想创建服务器,那么就需要先导入HTTP模块,与path和fs模块一样,通过require进行引用
1.2、进一步理解http模块的作用
- 服务器 和普通电脑的区别在于 服务器上安装了“web服务器软件”,例如:IIS,Apache等等,通过安装这些服务器的软件,就能够将一台普通的电脑转换为一台Web服务器
- 在学习javaweb的时候我们也接触过一个类似的东西,Apache下的Tomcat服务器
- 通过解压缩的方式安装了这个服务器后我们自己的电脑就是一台服务器了,通过学籍更高端的知识,达到将我们计算机的资源进行对外的开放,当然,效果远不止于此
2、服务器相关的概念
2.1、IP地址
- 这个相当于复习计算机的知识了,我还需要翻阅一下
- 以IPv4的格式来描述的话,一般的IP地址是由32位二进制组成
- 为了能够更好的显示,以每8位二进制组成一位10进制,分成四组
- 二进制的范围是 0-2^8-1,也就是0-255
- IP地址是每台计算机在互联网当中的唯一标识,两台计算机想要共享数据,完成数据的交互,就需要知道对方的IP地址
- 在开发期间,自己的电脑既是一台服务器,也是一台客户端,所以在自己电脑上使用IP地址 127.0.0.1或者 localhost:3306端口是一样的效果
2.2、域名和域名系统(域名服务器)
- 也回顾一下之前的知识吧
- 首先,计算机之间的交互是需要知道对方的IP地址,二者才能进行访问和交互
- 就像现实当中的 身份证 一样,一个身份证号码代表了一个人,二者是一一对应的
- 如果要让我记住你这个人,比起记住你的身份证号码,我更愿意记住你的姓名
- 这里的身份证就代表IP地址,而域名代表了名字
- 例如百度服务器的IP地址为:14.215.177.38,他的域名就是www.baidu.con,谁更好记住,不需要多说吧?
那么什么是域名系统呢?
- DNS,域名服务器,在我们的计算机当中,网络和Internet设置当中,都配置了域名服务器
- 一般是自动获取的,当然我们也可以手动设置域名服务器,这些百度一大堆,不细说
- 域名服务器就相当于一个数据库,将每台服务器的IP地址和他的域名一一对应
- 当你通过IP地址访问一个服务器的时候,可以直接访问,但是大部分人不会这么做
- 当你通过域名访问一个服务器的时候,DNS会将这个域名通过自己的服务,转换为IP地址,然后在通过这个IP地址去访问你需要访问的服务,这就是DNS的左永刚
2.3、端口号
也算是重温知识吧,越是质朴的底层逻辑往往才是破局的关键之理
2.4、创建最基本的Web服务器
- 导入http模块
- 创建web服务器实例
- 为服务器绑定request事件,监听客户端的需求
- res是response(响应对象),req是request对象(请求对象),回顾一下
- 启动服务器
- 查看结果
- 在浏览器当中访问我们的web服务,可以是127 + 端口号,也可以是localhost+端口号
2.5、一些细节的讲解
- 在on方法当中配置request的时候,代表的是,当用户访问服务器成功的时候,会执行这里的函数
- 在listen函数当中,当服务器启动的时候,执行函数当中的内容
- 由于我们服务器并未给用户任何响应,所以客户端那边在访问的时候会一直转圈圈
- 停止服务器:ctrl + C即可停止
2.6、req和res
1、req
一个请求对象,一个响应对象,请求对象当中包含着很多参数,例如用户提供的一些参数,都存放在请求体参数当中
响应对象则是我们后台需要做的事情了,我们会通过这个响应对象对客户端进行响应
/*
* @Author: WavesBright 1336959829@qq.com
* @Date: 2022-09-28 23:02:08
* @LastEditors: WavesBright 1336959829@qq.com
* @LastEditTime: 2022-09-28 23:12:14
* @FilePath: \node\demo4_http模块\02_req请求对象.js
* @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
*/
// 1、导入http模块
const http = require('http')
// 2、创建web服务器实例
const server = http.createServer();
// 3、为实例对象编写request请求函数
server.on('request',(req,res)=>{
/**
* req.url,请求的url地址,指的是,端口号后面的内容
* 我等下倒要看看这个req当中有什么东西
*/
// 模板引号
const str = `your request url is ${req.url},and your method is ${req.method}`
console.log(str);
})
// 4、启动web服务器
server.listen(8080,()=>{
console.log('welcome to my webServer,http://localhost:8080');
})
2、res
response响应对象,通过nodeJs当中的end方法完成对请求的响应,并且,结束这次请求,也就是浏览器访问的时候不会转圈圈了
// 3、为实例对象编写request请求函数
server.on('request',(req,res)=>{
/**
* req.url,请求的url地址,指的是,端口号后面的内容
* 我等下倒要看看这个req当中有什么东西
*/
// 模板引号
const str = `your request url is ${req.url},and your method is ${req.method}`
// console.log(str);
// 使用res进行响应
res.end(str)
})
3、中文乱码问题
设置响应头的类型即可
测试
配置响应头
再次测试
3、时钟案例
3.1、概述
- 目的是将之前做过的项目的内容,通过响应对象,传输到网页上
- 在做之前,我发现了一个问题,这个res的end函数,它到底是干什么的?
3.2、开发过程
- 导入fs模块对文件进行读取,path模块用于对路径进行拼接,http模块用于创建web服务器并对请求进行响应
- 实例化web服务器对象
- 为服务器对象配置request请求事件,配置监听器
- 在request请求当中对用户的请求方式进行判断
- 启动服务器
3.3、代码保存
// 导入http模块,path模块,fs模块
const fs = require('fs')
const path = require('path')
const http = require('http')
// 1、实例化服务器对象
const server = http.createServer();
// 2、为服务器对象配置request事件,对其设置监听对象
server.on('request',(req,res)=>{
// 2.1、通过用户访问的资源路径,判断用户所需资源
var userResources = req.url; // 假设我这里访问的是,/index.html
// 2.2、对字符串进行拼接,因为此时文件存放在clock文件夹当中
// 通过__dirname获取当前js文件所处文件目录,通过path的join模块对其进行维护,增强移植性
var resourcePath = path.join(__dirname,'clock',userResources)
// 2.3、使用fs模块对文件进行读取,这里我就不写第二个参数了
// readFile是一个异步方法,所以剩下的东西我们需要在该函数当中进行编写了
fs.readFile(resourcePath,(err,dataStr)=>{
// 错误访问
if(err){
// 响应用户的时候,结束本次请求
res.end('您要访问的资源并不存在!')
}else{
// 好像不行,我直接返回给客户端访问数据测试一下
res.end(dataStr)
}
})
})
// 3、启动Web服务器
server.listen(8080,()=>{
console.log('Web server start.......,IP is => 127.0.0.1:8080')
});