深入剖析http模块
一、深入剖析http模块
1.连接服务器
const http = require("http");
const request = http.request(
"http://duyi.ke.qq.com/",
{
method: "GET"
},
resp => {
console.log("服务器响应的状态码",resp.statusCode);
console.log("服务器响应头",resp.headers["content-type"]);
}
);
request.end();//表示我写完了,消息体结束
如果想获取到服务器的响应体
const http = require("http");
const request = http.request(
"http://duyi.ke.qq.com/",
{
method: "GET"
},
resp => {
console.log("服务器响应的状态码",resp.statusCode);
console.log("服务器响应头",resp.headers);
let result = "";//服务器响应结果以流的形式返回,我可们可以拼接
resp.on("data", chunk => {
result =+ chunk.toString("utf-8");
});
resp.on("end", chunk => {
console.log(result);
});
}
);
request.end();
如果请求一个API地址
resp.on("end", chunk => {
console.log(JSON.parse(result));//转成json即可
});
如果是post请求
const http = require("http");
const request = http.request(
"http://yuanjin.tech:5005/api/movie",
{
method: "POST"
},
resp => {
console.log("服务器响应的状态码",resp.statusCode);
console.log("服务器响应头",resp.headers);
let result = "";
resp.on("data", chunk => {
result += chunk.toString("utf-8");
});
resp.on("end", chunk => {
console.log(JSON.parse(result));
});
}
);
request.write("***********");
request.end();
2.搭建自己的服务器
const http = require("http");
const url = require("url");
const server = http.createServer((req,res) => {
console.log('有请求来了!!');
const urlObj = url.parse(req.url);
console.log("请求路径",urlObj);
console.log("请求方法",req.method);
console.log("请求头",req.headers);
let body = "";
req.on("data",chunk => {
body += chunk;
});
req.on("end",() => {
console.log("请求体",body);
});
});
server.listen(9527);
server.on("listening",()=>{
console.log("server listen 9527");
});
此时浏览器收不到响应信息,会等待一段时间
const http = require("http");
const url = require("url");
function handleReq(req){
console.log('有请求来了!!');
const urlObj = url.parse(req.url);
console.log("请求路径",urlObj);
console.log("请求方法",req.method);
console.log("请求头",req.headers);
let body = "";
req.on("data",chunk => {
body += chunk;
});
req.on("end",() => {
console.log("请求体",body);
});
}
const server = http.createServer((req,res) => {
handleReq(req);
res.setHeader('a',1);
res.setHeader('b',2);
res.statusCode = 200;
res.write("你好!");
res.end();
});
server.listen(9527);
server.on("listening",()=>{
console.log("server listen 9527");
});
3.练习—静态资源服务器
//静态资源服务器
// http://localhost:9527/index.html -> public/index.html 文件内容
// http://localhost:9527/css/index.css -> public/css/index.css 文件内容
const http = require("http");
const URL = require("url");
const path = require("path");
const fs = require("fs");
async function getStat(filename) {
try {
return await fs.promises.stat(filename);
} catch {
return null;
}
}
/**
* 得到要处理的文件内容
*/
async function getFileContent(url) {
const urlObj = URL.parse(url);
let filename;
filename = path.resolve(__dirname, "public", urlObj.pathname.substr(1));
let stat = await getStat(filename);
if (!stat) {
//文件不存在
return null;
} else if (stat.isDirectory()) {
//文件是一个目录
filename = path.resolve(
__dirname,
"public",
urlObj.pathname.substr(1),
"index.html"
);
stat = await getStat(filename);
if (!stat) {
return null;
} else {
return await fs.promises.readFile(filename);
}
} else {
return await fs.promises.readFile(filename);
}
}
async function handler(req, res) {
const info = await getFileContent(req.url);
if (info) {
res.write(info);
} else {
res.statusCode = 404;
res.write("Resource is not exist");
}
res.end();
}
const server = http.createServer(handler);
server.on("listening", () => {
console.log("server listen 9527");
});
server.listen(9527);