node:http 协议:请求响应报文-web服务-url与对象的转化-ajax-cors跨域
1 梳理重点
1.1搭建服务
注意:
① 站点创建完成后,需要通过node命令启动
② 创建站点的代码如果发生变化,需要重启服务
③ 当用户输入域名:端口号/a/b,会请求到createServer接收的回调函数,回调函数需要给予响应,如果没有响应那么会一直请求下去
④ response.end():end 传入的信息全部在该对象内
const http = require("http");// 内置模块
const url = require("url");// 内置模块
// request:请求对象,与请求相关的信息全部在该对象内。
const server = http.createServer(function(request,response){
// request.url; 请求的网址
//假如:http://127.0.0.1:8090/a/b/c?one=1 那么req.url === /a/b/c?one=1
// request.url可以帮助我们获得资源: url.parse("/a/b/c?one=1") ====>{pathname:"/a/b/c",query:"one=1"}
const pathname = url.parse(request.url).pathname;// /a/b/c
if(pathname === "/a/b/c"){
// 200:成功 404:页面找不到 500:服务端异常 304:缓存
// 这个状态码是可以自定义的。
response.writeHead(200,{
// 文件是一个html类型,编码为utf-8
// "content-type":"text/html;charset=utf-8;"
// "content-type":"text/plain;charset=utf-8;"
})
response.end();
}
})
// http 默认端口号80 ,https默认端口号443.
// 127.0.0.1:指定访问该站点的IP,如果省略则不限制
// 第三个参数是一个回调函数,当服务搭建完成以后会执行。
server.listen(80,"127.0.0.1",function() {
console.log("站点创建成功");
})
1.2 fs
const fs = require("fs");
fs.readFile("请求地址",function(err,result){
result.toString()});// 异步读取
const result = fs.readFileSync("请求地址");// 同步读取,将结果直接返回
const rs = fs.createReadStream("请求地址");
rs.on("data",function(thunk){
});// 第次读取64k
rs.on("end",function(){
});// 寻数据接收完毕之后执行
fs.writeFile();// 异步读取
fs.writeFileSync();// 同步读取
const ws = fs.createWriteStream("");
ws.on("open",function(){
});
ws.write();
ws.on("close",function(){
});
ws.close();
fs.unlink()// 删除
fs.unlinkSync()// 同步删除
fs.rename();// 实现重命名或移动
fs.renameSync();// 同步实现重命名或移动
fs.mkdir();// 创建文件夹目录
fs.readdir();// 读取文件夹的信息
fs.rmdir();// 移除文件夹
fs.exists();// 判断是否存在
fs.stat();// 判断是否为一个文件或目录。
1.3 模块化
将一个大的项目,分成若干个模块,在node中,每一个JS即是一个模块,优化之前的代码
// 获取当前时间:封装到一个名字为utils.js的模块当中。
// 2012/02/09 utils.end(res,1,"添加成功")
// 比如: res.end(JSON.stringify({ok,mag}))
module.exports.end = function(res,ok=-1,msg="网络连接错误"){
res.end(JSON.stringify({
ok,
msg
}))
}
2 HTTP 协议介绍
HTTP(hypertext transport protocol)协议也叫超文本传输协议,是一种基于 TCP/IP 的应用层通信协议,这个协议详细规定了浏览器和万维网服务器之间互相通信的规则。
协议主要规定了两方面的内容
- 客户端向服务器发送数据,称之为请求报文
- 服务器向客户端返回数据,称之为响应报文
3 请求报文
HTTP 请求报文包括四部分
- 请求行 请求方式 协议以及版本 http1.1 url(资源定位符,俗称网址)
- 请求头 传递 token session cookie
- 空行
- 请求体 传递数据。(post:添加 put修改 delete删除) get(获取) http://www.baidu.com?a=1&b=2
// 请求行
GET https://www.baidu.com/?tn=80035161_1_dg HTTP/1.1
// 请求头
Accept: text/html, application/xhtml+xml, image/jxr, */*
Accept-Language: zh-Hans-CN,zh-Hans;q=0.5
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; Touch; rv:11.0) like Gecko
Accept-Encoding: gzip, deflate
Host: www.baidu.com
Connection: Keep-Alive
Cookie: COOKIE_SESSION=0_0_0_1_0_0_0_0_0_0_0_0_0_0_0_0_0_0_1606723864%7C1%230_0_1606723864%7C1; BD_UPN=1126314751; BD_HOME=1; BAIDUID=A613B163177AE92B8F2EA3C53D3B8227:FG=1; BIDUPSID=3A8FF4428ACCEE4CB183D3184E180560; PSTM=1587224822; BDRCVFR[k2U9xfnuVt6]=mk3SLVN4HKm; H_PS_PSSID=31253_26350; BA_HECTOR=2g040k8k0184ak216k1g9mdhd0r
// 空行
// 请求体:请求的数据。
/*1、请求行*/
// * GET:请求的方式
// * https://www.baidu.com/?tn=80035161_1_dg: url(资源定位符,俗称网址)
// * HTTP/1.1 : 请求的协议以及版本号。
/*2、请求头*/
// Accept:指定了接收资源的类型。
// Accept-Language: zh-Hans-CN,zh-Hans;q=0.5
// Accept-Encoding: gzip, deflate。
// User-Agent:将浏览器的信息进行说明。代理。
// Host:主机名
// Connection: Keep-Alive 指定连接的状态一般值 为 Keep-Alive(长连接) close(关闭)
- GET http://localhost:3000/hello.html HTTP/1.1:GET请求,请求服务器路径为http://localhost:3000/hello.html,?后面跟着的是请求参数(查询字符串),协议是HTTP 1.1版本
- Host: localhost:3000:请求的主机名为localhost,端口号3000
- Connection: keep-alive:处理完这次请求后继续保持连接,默认为3000ms
- Pragma: no-cache:不缓存该资源,http 1.0的规定
- Cache-Control: no-cache: 不缓存该资源 http 1.1的规定,优先级更高
- Upgrade-Insecure-Requests: 1:告诉服务器,支持发请求的时候不用 http 而用 https
- User-Agent: Mozilla/5.0 (…:与浏览器和OS相关的信息。有些网站会显示用户的系统版本和浏览器版本信息,这都是通过获取User-Agent头信息而来的
- Accept: text/html,…:告诉服务器,当前客户端可以接收的文档类型。q 相当于描述了客户端对于某种媒体类型的喜好系数,该值的范围是 0-1。默认为1
- Accept-Encoding: gzip, deflate, br:支持的压缩格式。数据在网络上传递时,服务器会把数据压缩后再发送
- Accept-Language: zh-CN,zh;q=0.9:当前客户端支持的语言,可以在浏览器的工具选项中找到语言相关信息
4 响应报文
HTTP 响应报文也包括四个部分