1. JS内部的ajax就算一个请求,由ajax发送请求, 返回的数据给到了ajax
2. 在浏览器地址栏内输入地址敲回车,由浏览器发送, 返回的数据给到浏览器
3. img、link和script这些标签也可以发送请求,由标签发送, 返回的数据给到了标签
http://localhost:8080/a/b/c/index.html
- 如果请求的地址是 ./out.js,实际请求的地址:http://localhost:8080/a/b/c/out.js
- 如果请求的地址是 ./a/out.js,实际请求的地址:http://localhost:8080/a/b/c/a/out.js
- 如果请求的地址是 ../a/out.js,实际请求的地址:http://localhost:8080/a/b/a/out.js
- 如果请求的地址是 /a.js,实际请求的地址:http://localhost:8080/a.js
- 如果请求的地址 /a/b.js,实际请求的地址:http://localhost:8080/a/b.js

- const http = require("http");
-
- // 1. 创建一个服务器
- const server = http.createServer(function (req, res) {
- console.log(req.url);
-
- });
-
- // 2. 给服务监听一个端口号
- server.listen(8080, () => {
- console.log('恭喜你,服务器启动成功');
- console.log('目前正在监听8080端口! ');
- console.log('基准地址:http://localhost:8080');
- });

- const http = require("http");
- const url = require("url");
-
- // 1. 创建一个服务器
- const server = http.createServer(function (req, res) {
- console.log(url.parse(req.url,true));
-
- });
-
- // 2. 给服务监听一个端口号
- server.listen(8080, () => {
- console.log('恭喜你,服务器启动成功');
- console.log('目前正在监听8080端口! ');
- console.log('基准地址:http://localhost:8080');
- });

- const http = require("http");
- const url = require("url");
- const fs = require("fs");
-
- // 1. 创建一个服务器
- const server = http.createServer(function (req, res) {
- const { pathname, query } = url.parse(req.url, true);
- console.log(pathname, query);
-
- if (pathname === "/a") {
- // 1. 读取 ./client/views/index.html 文件
- fs.readFile("./client/views/index.html", "utf-8", function (err, data) {
- if (err) return console.log(err);
-
- // console.log(data)
- // 通过 res.end() 返回给浏览器
- res.end(data);
- });
- }
-
- if (pathname === "/b") {
- fs.readFile("./client/views/list.html", "utf-8", function (err, data) {
- if (err) return console.log(err);
-
- // console.log(data)
- res.end(data);
- });
- }
- 1
- });
-
- // 2. 给服务监听一个端口号
- server.listen(8080, () => {
- console.log('恭喜你,服务器启动成功');
- console.log('目前正在监听8080端口! ');
- console.log('基准地址:http://localhost:8080');
- });

- 如果需要访问html文件, 将路径开头写上 /views 后续拼接上对应的文件名
- 假如要访问 index.html,路径: /views/index.html
- 假如要访问 list.html,路径: /views/list.html
- 如果要访问css文件需要使用 /style 开头 后续拼接上对应的文件名
- 假如要访问 index.css,路径: /style/index.css
- 假如要访问 list.css,路径: /style/list.css
index和list的html代码

index和list的css代码

服务器代码实现
- const http = require("http");
- const url = require("url");
- const fs = require("fs");
- const path = require("path");
-
- const server = http.createServer(function (req, res) {
- const { pathname, query } = url.parse(req.url, true);
- // html的格式
- if (/^\/views/.test(pathname)) {
- // 拿到文件名
- const { base } = path.parse(pathname);
-
- // 读取对应文件返回给请求者
- fs.readFile(`./client/views/${base}`, "utf-8", function (err, data) {
- if (err) return console.log(err);
- res.end(data);
- });
- }
- // css的样式
- if (/^\/style/.test(pathname)) {
- // 拿到文件名
- const { base } = path.parse(pathname);
- // 读取对应文件返回给请求者
- fs.readFile(`./client/css/${base}`, "utf-8", function (err, data) {
- if (err) return console.log(err);
- res.end(data);
- });
- }
- });
-
- // 2. 给服务监听一个端口号
- server.listen(8080, () => {
- console.log('恭喜你,服务器启动成功');
- console.log('目前正在监听8080端口! ');
- console.log('基准地址:http://localhost:8080');
- });
新约定1
- 以 /static 开头,后续跟着写上对应的目录与文件名
- 如果访问的是 index.html;路径: /static/views/index.html
- 如果访问的是 list.html;路径: /static/views/list.html
- 如果访问的是 index.css;路径: /static/css/index.css
新约定2
- 以 /static 开头,后续写文件名
- 如果我需要访问 index.html;路径: /static/index.html
- 如果我需要访问 index.css;路径: /static/index.css

index和list的html代码

服务器代码实现
- const http = require("http");
- const url = require("url");
- const fs = require("fs");
- const path = require("path");
-
- const server = http.createServer(function (req, res) {
- const { pathname, query } = url.parse(req.url, true);
- console.log(path.parse(pathname));
- if (/^\/static/.test(pathname)) {
- /*
- path.parse(pathname);
- {
- root: '/',
- dir: '/static',
- base: 'list.html',
- ext: '.html',
- name: 'list'
- }
- */
- // 拿到文件的后缀名与文件名
- const { base, ext } = path.parse(pathname);
-
- // 根据后缀名拼接上对应的路径
- let baseUrl = "./client";
- if (ext === ".html") {
- baseUrl += "/views";
- } else if (ext === ".css") {
- baseUrl += "/css";
- }
-
- // 根据处理过的路径读取对应文件返回给请求者
- fs.readFile(`${baseUrl}/${base}`, "utf-8", function (err, data) {
- if (err) {
- fs.readFile("./404.html", "utf-8", (err, data) => {
- if (err) return;
-
- res.end(data);
- });
- return;
- }
- res.end(data);
- });
- }
- });
-
- server.listen(8080, () => {
- console.log('恭喜你,服务器启动成功');
- console.log('目前正在监听8080端口! ');
- console.log('基准地址:http://localhost:8080');
- });
index和list的html代码

index的js代码
- const xhr = new XMLHttpRequest()
- xhr.open('POST', '/api/users/login')
-
- xhr.onload = function () {
- console.log(JSON.parse(xhr.responseText))
- }
- xhr.send('username=QF001&password=123456')
服务器代码
- const http = require("http");
- const url = require("url");
- const fs = require("fs");
- const path = require("path");
-
- const server = http.createServer(function (req, res) {
- const { pathname, query } = url.parse(req.url, true);
-
-
- if (/^\/static/.test(pathname)) {
- // 拿到文件的后缀名与文件名
- const { base, ext } = path.parse(pathname);
-
- // 根据后缀名拼接上对应的路径
- let baseUrl = "./client";
- if (ext === ".html") {
- baseUrl += "/views";
- } else if (ext === ".css") {
- baseUrl += "/css";
- } else if (ext === ".js") {
- baseUrl += "/js";
- }
-
- // 根据处理过的路径读取对应文件返回给请求者
- fs.readFile(`${baseUrl}/${base}`, "utf-8", function (err, data) {
- if (err) {
- if (ext === ".html") {
- fs.readFile("./404.html", "utf-8", (err, data) => {
- if (err) return;
-
- res.end(data);
- });
- } else {
- res.end("");
- }
- return;
- }
- res.end(data);
- });
- }
-
- if (/^\/api/.test(pathname)) {
- if (pathname === "/api/users/info" && req.method === 'GET') {
-
- // 接收到请求, 去数据库 拿到对应的 数据 返回给 请求者
- const info = {
- code: 1,
- message: '请求/users/info接口成功',
- info: {
- id: 1,
- name: 'QF666',
- age: 18
- }
- }
-
- // 返回给前端
- res.end(JSON.stringify(info))
- }
- }
- });
-
- server.listen(8080, () => {
- console.log('恭喜你,服务器启动成功');
- console.log('目前正在监听8080端口! ');
- console.log('基准地址:http://localhost:8080');
- });

接收请求体的数据, 有两个事件
1. req.on('data', () => {}) ;每当开始解析请求体, 就会执行, 回调函数接受一个参数
这个参数的值就是ajax send发送时携带的参数 (注意: 该函数会多次执行, 次数不确定)
2. req.on('end', () => {}) 这个函数执行的时候, 表明请求体 全部解析完成
list的js代码
- const xhr = new XMLHttpRequest()
- xhr.open('POST', '/api/users/login')
-
- xhr.onload = function () {
- console.log(JSON.parse(xhr.responseText))
- }
- xhr.send('username=QF001&password=123456')
post的主要代码

post的完整代码
- const http = require("http");
- const url = require("url");
- const fs = require("fs");
- const path = require("path");
-
- const server = http.createServer(function (req, res) {
- const { pathname, query } = url.parse(req.url, true);
- if (/^\/static/.test(pathname)) {
- // 拿到文件的后缀名与文件名
- const { base, ext } = path.parse(pathname);
-
- // 根据后缀名拼接上对应的路径
- let baseUrl = "./client";
- if (ext === ".html") {
- baseUrl += "/views";
- } else if (ext === ".css") {
- baseUrl += "/css";
- } else if (ext === ".js") {
- baseUrl += "/js";
- }
-
- // 根据处理过的路径读取对应文件返回给请求者
- fs.readFile(`${baseUrl}/${base}`, "utf-8", function (err, data) {
- if (err) {
- if (ext === ".html") {
- fs.readFile("./404.html", "utf-8", (err, data) => {
- if (err) return;
-
- res.end(data);
- });
- } else {
- res.end("");
- }
- return;
- }
- res.end(data);
- });
- }
-
- /**
- * 约定, 所有接口相关的, 全都以 /api 开头
- */
- if (/^\/api/.test(pathname)) {
- if (pathname === "/api/users/info" && req.method === "GET") {
- // 接收到请求, 去数据库拿到对应的数据返回给请求者
- const info = {
- code: 1,
- message: "请求/users/info接口成功",
- info: {
- id: 1,
- name: "QF666",
- age: 18,
- },
- youparams: query,
- };
-
- // 返回给前端
- res.end(JSON.stringify(info));
- }
-
- if (pathname === "/api/users/login" && req.method === "POST") {
-
- let str = ''
- req.on("data", (paramsStr) => {
- // 因为请求体内容比较多, 在解析的时候, 可能是分段解析,
- str += paramsStr
- });
-
- req.on('end', () => {
- console.log(str) // username=QF001&password=123456
- const info = {
- code: 1,
- message: "请求 /users/login 接口 成功",
- youparams: str,
- };
-
- res.end(JSON.stringify(info));
- })
-
- }
- }
- });
-
- server.listen(8080, () => {
- console.log('恭喜你,服务器启动成功');
- console.log('目前正在监听8080端口! ');
- console.log('基准地址:http://localhost:8080');
- });

- post请求传参是世界约定,要么传递查询字符串, 要么传递 json 字符串
- post请求传参解析是世界约定,在请求头内部配置 content-type,
- 如果值为application/x-www-form-urlencoded 代表传递是查询字符串,
- 如果值为 application/json 代表传递的 json字符串
list中的js代码
- const xhr = new XMLHttpRequest();
- xhr.open("POST", "/api/users/login");
-
- xhr.onload = function () {
- console.log(JSON.parse(xhr.responseText));
- };
-
- xhr.setRequestHeader('content-type', 'application/x-www-form-urlencoded')
- xhr.send("username=QF001&password=123456");
-
- // xhr.setRequestHeader("content-type", "application/json");
- // xhr.send('{ "username": "QF001", "password": "123456" }');
分析





- const http = require("http");
- const url = require("url");
- const fs = require("fs");
- const path = require("path");
-
- const server = http.createServer(function (req, res) {
- const { pathname, query } = url.parse(req.url, true);
- if (/^\/static/.test(pathname)) {
- // 拿到文件的后缀名与文件名
- const { base, ext } = path.parse(pathname);
-
- // 根据后缀名拼接上对应的路径
- let baseUrl = "./client";
- if (ext === ".html") {
- baseUrl += "/views";
- } else if (ext === ".css") {
- baseUrl += "/css";
- } else if (ext === ".js") {
- baseUrl += "/js";
- }
-
- // 根据处理过的路径读取对应文件返回给请求者
- fs.readFile(`${baseUrl}/${base}`, "utf-8", function (err, data) {
- if (err) {
- if (ext === ".html") {
- fs.readFile("./404.html", "utf-8", (err, data) => {
- if (err) return;
-
- res.end(data);
- });
- } else {
- res.end("");
- }
- return;
- }
- res.end(data);
- });
- }
-
- /**
- * 约定, 所有 接口相关的, 全都 以 /api 开头
- */
- if (/^\/api/.test(pathname)) {
- if (pathname === "/api/users/info" && req.method === "GET") {
- // 接收到请求, 去数据库 拿到对应的 数据 返回给 请求者
- const info = {
- code: 1,
- message: "请求 /users/info 接口 成功",
- info: {
- id: 1,
- name: "QF666",
- age: 18,
- },
- youparams: query,
- };
-
- // 返回给前端
- res.end(JSON.stringify(info));
- }
-
- if (pathname === "/api/users/login" && req.method === "POST") {
- /**
- * post 请求 传参 世界约定
- * 要么传递 查询字符串, 要么传递 json 字符串
- *
- * post 请求 传参解析 是 世界约定
- * 在请求头内部 配置 content-type
- * 如果 值 为 application/x-www-form-urlencoded 代表传递是 查询字符串
- * 如果 值 为 application/json 代表传递的 json
- */
- let str = "";
- req.on("data", (paramsStr) => {
- str += paramsStr;
- });
-
- req.on("end", () => {
- /*
- console.log(req.headers['content-type'])
- {
- ...
- 'content-type': 'application/x-www-form-urlencoded',
- ...
- }
- */
- if (req.headers["content-type"] === "application/json") {
- str = JSON.parse(str);
- }
-
- if (
- req.headers["content-type"] ===
- "application/x-www-form-urlencoded"
- ) {
- /**
- console.log(str); // username=QF001&password=123456
- let { query } = url.parse("?" + str, true);
- console.log(query)
- query === {
- username: QF001,
- password: 123456
- }
- */
-
- str = url.parse("?" + str, true).query;
- }
- const info = {
- code: 1,
- message: "请求 /users/login 接口 成功",
- youparams: str,
- };
-
- res.end(JSON.stringify(info));
- });
- }
- }
- });
-
- server.listen(8080, () => {
- console.log('恭喜你,服务器启动成功');
- console.log('目前正在监听8080端口! ');
- console.log('基准地址:http://localhost:8080');
- });