一、HTTP
(一)提取url路径和获取字符串
在浏览器中,请求服务器中的请求头,请求体是可以在浏览器中看到的;
开发过程中,也会经常获取请求信息。
1.通过url模块获取
通过url模块中的parse()可以将请求参数显示出来;
但是图中代码url.parse(req.url)
获取到的都是字符串。如果想要更加方便的object类型,可以增加一个参数url.parse(req.url,true)
;
增加一个参数,获取的query会给出一个对象形式的值;这样就可以通过‘.’的形式获取
query.username
const parse = url.parse(req.url, true)
console.log('解析结果', parse);
console.log('解析结果', parse.query.username)//
获取到的结果如下
2.通过实例化对象获取
实例化url与第一种方法的区别是不需要引入url模块,但是获取到请求参数的方法也不同
具体方式如下:
// 创建服务器对象
const server = http.createServer((req, res) => {
// 实例化url
// let url = new URL('http://localhost:9000?search=%27%E5%8D%81%E4%B8%87%E4%B8%AA%E4%B8%BA%E4%BB%80%E4%B9%88%27')
let url = new URL(req.url, 'http://127.0.0.1')
console.log(url.searchParams) //URLSearchParams { 'search' => "'十万个为什么'" }
console.log(url.searchParams.get('search'))
console.log(url.searchParams.search)
res.end('你好呀')
})
代码运行的结果如下
(二)http请求响应
const server = http.createServer((req, res) => {
// 设置响应状态码
res.statusCode = 200;
// 设置响应状态描述(一般不用)
res.statusMessage = 'descript'
// 设置响应头
res.setHeader('content-type', 'text/html;charset=utf-8')
res.setHeader('resHead', 'hhhhh')
res.setHeader('heads', ['a', 's', 'd'])//设置多个同名响应头
// 设置响应体
res.write('你心动了🐎')
res.end();
})
代码执行结果
(三)搭建静态资源服务器
1.获取文件请求路径;
2.通过readFile()方法可以**读取**到文件;
3.通过write()的方法可以将响应体输出到页面。
所以结合上述方法可以实现静态html的资源获取
const server = http.createServer((req, res) => {
// 获取请求路径
const { pathname } = new URL(req.url, 'http://127.0.0.1')
// 动态获取资源
fs.readFile(__dirname + '\\page' + pathname, ((err, data) => {
if (err) {
if (err.path.includes('favicon.ico')) {
return
}
console.log('请求出错:', err)
return
}
res.end(data)
}))
})
通过上述代码,可以获取到请求路径中的pathname 比如下面的请求路径获取到的就是 form.html;
如果本地有该文件,会被呈现到你的浏览器页面;即使你的静态资源都是通过link引入的也会被获取到
(四)设置响应状态类型
静态资源的形式很多,为了更加规范,在读取文件之后可以设置文件类型
//设置文件类型
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'
}
// 设置响应资源的mime类型(媒体/资源)
// 获取文件后缀名
const ext = path.extname(pathname)//.css
const type = ext.slice(1)//css
const typ = mime[type]
if (!typ) {
res.setHeader('content-type', 'application/octet-stream')
}
res.setHeader('content-type', typ)
(五)解决中文乱码问题
在请求静态资源中,有些资源会乱码;为了规避乱码问题,可以在响应头中设置字符编码;
响应头中的编码优先级 比html文件中的meta标签要高
if (!typ) {
res.setHeader('content-type', 'application/octet-stream')
}
res.setHeader('content-type', typ)
if (type === 'html') {
res.setHeader('content-type', typ + ';charset=utf-8')//在头文件中设置的字符集 优先级高于html中meta
}
总结
跟着网课总结的笔记,每一段代码自己都有敲一遍验证,不懂得知识点还有很多,慢慢努力吧!
这个是nodejs学前笔记的续集,只是看到一半想起来大学javaweb都学过;果然是“少壮不努力,老大徒伤悲。”