创建http服务端
创建步骤
1.导入http模块 const http=require('http');
2.创建服务对象 const server=http.createServer((req,res)=>{}); //有请求执行回调
3.监听端口,启动服务 server.listen(3000,()=>{}); //监听计算机的3000端口,如果有客户端向本计算机的3000端口发送请求,执行回调函数
注意事项
1.响应体直接返回中文会乱码
需要设置响应头: const server=http.createServer((req,res)=>{ res.setHeader('content-type','text/html;charset=utf-8');res.end('你好')});
2.http协议的默认端口为80,https协议默认端口为443,开发常用端口有3000、8090、8080、9000等
3.如果其他端口被占,不知道哪个资源占用了这个端口,可进入电脑的 资源监视器-侦听端口 查看
获取http请求报文信息
获取请求行信息
(1)获取请求方法 req.method
(2)获取请求路径 req.url //只包含url中的路径与查询字符串
=>提取路径和查询字符串
方法一
1.引入url模块 const url=require('url')
2.提取路径 let res_=url.parse(req.url);
let pathname=res_.pathname;
4.提取查询字符串 let res_=url.parse(req.url,true); //把query变为对象
let keyword=res_.query.keyword;
方法二
1.let url=new URL(req.url,'http://127.0.0.1');
2.路径 console.log(url.pathname);
3.查询字符串 console.log(url.searchParams.get('keyword'))

(3)获取http版本 req.httpVersion //不常用
(4)获取请求头 req.headers //返回一个对象

获取请求体信息
1.声明变量 let body='';
2.绑定data事件 req.on('data',chunk=>{body+=chunk;})
3.绑定end事件 req.on('end',()=>{console.log(body);res.end("hello');})
http响应设置
设置响应行信息
设置状态码 res.statusCode=404;…
响应状态描述 res.statusMessage='aaa'; //一般都自动适应 很少自己设置
设置响应头
res.setHeader(响应头名字,值) //res.setHeader('Content-type','text/html;charset=utf-8');
设置响应体
res.write() //可以多次调用,一般设置了write就不在end中设置内容了
或
res.end() //必须有且只有一个
返回html文档

请求资源加载过程:客户端先向服务器发送请求获取html文档,遇到外部css文档,请求获取,遇到图片资源,请求获取,遇到js,请求获取,各个请求是并行的
搭建静态资源服务
1.读取路径并返回对应文件内容
静态资源目录,即网站根目录,是静态资源所在的目录
2.为不同文件类型返回正确格式
mime类型//媒体类型

根据不同文件的mime类型返回不同类型的文件格式:
let mime={
html:'text/html',css:'text/css',js:'text/javascript',
png:'image/png',jpg:'image/jpeg',gif:'image/gif',
mp4:'video/mp4',mp3:'audio/mpeg',json:'application/json'
}
let ext=path.extname(filePath).slice(1);
let type=mimes[ext];
if(type){res.setHeader('content-type',type)}
else{res.setHeader('content-type','application/octet-stream')}
//对于未知类型资源,可以选择application/octet-stream类型,浏览器在遇到该类型的响应时,会对响应体内容进行独立存储,也就是我们常见的下载效果
3.问题解决
解决乱码
在类型后加一个charset=utf-8
![]()
通常不需要手动加,会自动根据网页的字符集进行调整
错误处理
if(req.method!=='GET'){res.statusCode=405;res.end('<h1>405 Method Nod Allowed</h1>') //方法错误
fs.readFile(filePath,(err,data)=>{
if(err){
console.log(err);
res.setHeader('content-type','text/html;charset=utf-8');
switch(err.code){
case 'ENOENT':
res.statusCode=404;
res.end('<h1>404 Not Found</h1>')
case 'EPERM':
res.statusCode=403;
res.end('<h1>403 Forbidden</h1>');
default:
res.statusCode=500;
res.end('<h1>Internal Server Error</h1>')
}
}
}
路径
绝对路径

相对路径
需要与当前页面URL路径进行计算,等到完整URL后再发送请求(不可靠)







