第八节:http模块相关(基本用法、Request、Response、axios、内置http发请求)
一. 基本用法
1. 创建:使用createServer创建一个服务器
2. 监听:使用server.listen进行端口的监听
3. 返回:通过response.end(xxx);方法返回给前端
4. 补充listen监听的三个参数
◼ 端口port: 可以不传, 系统会默认分配端, 后续项目中我们会写入到环境变量中;
◼ 主机host: 通常可以传入localhost、ip地址127.0.0.1、或者ip地址0.0.0.0,默认是0.0.0.0;
localhost:本质上是一个域名,通常情况下会被解析成127.0.0.1;
127.0.0.1:回环地址(Loop Back Address),表达的意思其实是我们主机自己发出去的包,直接被自己接收;
✓ 正常的数据库包经常 应用层 - 传输层 - 网络层 - 数据链路层 - 物理层 ;
✓ 而回环地址,是在网络层直接就被获取到了,是不会经常数据链路层和物理层的;
✓ 比如我们监听 127.0.0.1时,在同一个网段下的主机中,通过ip地址是不能访问的;
0.0.0.0:
✓ 监听IPV4上所有的地址,再根据端口找到不同的应用程序;
✓ 比如我们监听 0.0.0.0时,在同一个网段下的主机中,通过ip地址是可以访问的;
◼ 回调函数:服务器启动成功时的回调函数;
单个监听
const http = require("http");
//1. 基本的http服务器
{
// 创建一个http对应的服务器
const server = http.createServer((request, response) => {
response.end("返回成功了");
});
// 开启对应的服务器,并监听端口
server.listen(8082, () => {
console.log("8082端口的服务器下已经开启");
});
}
多个监听
const http = require("http");
//2. 可以同时开启多个服务器
{
// 创建一个http对应的服务器
const server1 = http.createServer((request, response) => {
response.end("返回成功了");
});
// 开启对应的服务器,并监听端口
server1.listen(8080, () => {
console.log("8080端口的服务器下已经开启");
});
// 创建一个http对应的服务器
const server2 = http.createServer((request, response) => {
response.end("返回成功了");
});
// 开启对应的服务器,并监听端口
server2.listen(8081, () => {
console.log("8081端口的服务器下已经开启");
});
}
二. Request详解
1. 获取基本信息
(1). url: 形如 /UserInfo/AddUser
(2). method: 如 Get、Post、Put等
(3). headers:很多信息
const http = require("http");
const url = require("url");
const qs = require("querystring");
{
// 创建一个http对应的服务器
const server = http.createServer((request, response) => {
// 1. url信息
console.log(request.url);
// 2. method信息
console.log(request.method);
// 3. headers信息
console.log(request.headers);
response.end("请求成功了");
});
// 开启对应的服务器,并监听端口
server.listen(8082, () => {
console.log("----------8082端口的服务器下已经开启-------------");
});
}
2. 获取query参数
形如/User/GetUserInfo?pageSize=5&pageIndex=2中参数的获取
(1). 需要require导入 url 和 querystring .
(2). 解析url:url.parse(request.url)
(3). 解析query:qs.parse(urlInfo.query)
const http = require("http");
const url = require("url");
const qs = require("querystring");
{
// 创建一个http对应的服务器
const server = http.createServer((request, response) => {
// 形如: /User/GetUserInfo?pageSize=5&pageIndex=2
// 1. 解析url
const urlInfo = url.parse(request.url);
// 2. 解析query
let queryInfo = qs.parse(urlInfo.query);
console.log(queryInfo); // { pageSize: '5', pageIndex: '2' }
response.end("请求成功了");
});
// 开启对应的服务器,并监听端口
server.listen(8082, () => {
console.log("----------8082端口的服务器下已经开启-------------");
});
}
3. 获取body参数
以postman中发送 x-www-form-urlencoded 格式的请求为例,通过request监听data,然后qs.parse(result)转换成json对象
const http = require("http");
const url = require("url");
const qs = require("querystring");
{
// 创建一个http对应的服务器
const server = http.createServer((request, response) => {
// 1. 设置编码
request.setEncoding("utf-8");
// 2. 监听data,获取数据(request对象本质是一个readable可读流)
// 对应postman中 x-www-form-urlencoded 格式的提交
request.on("data", result => {
console.log(result); //pageIndex=2&pageSize=10
let jsonData = qs.parse(result);
console.log(jsonData); //{ pageIndex: '2', pageSize: '10' }
console.log(jsonData.pageIndex, jsonData.pageSize);
});
response.end("请求成功了");
});
// 开启对应的服务器,并监听端口
server.listen(8082, () => {
console.log("----------8082端口的服务器下已经开启-------------");
});
}
4. 获取header参数
通过request.headers["xxx"], 获取header中某个字段,比如token
const http = require("http");
const url = require("url");
const qs = require("querystring");
{
// 创建一个http对应的服务器
const server = http.createServer((request, response) => {
// 所有的headers信息
console.log(request.headers);
//获取headers中的token信息
console.log(request.headers["token"]);
response.end("请求成功了");
});
// 开启对应的服务器,并监听端口
server.listen(8082, () => {
console.log("----------8082端口的服务器下已经开启-------------");
});
}
5. 补充content-type类型
content-type是请求携带的数据的类型
application/x-www-form-urlencoded:表示数据被编码成以 '&' 分隔的键 - 值对,同时以 '=' 分隔键和值,形如:pageIndex=2&pageSize=10
application/json:表示是一个json类型;
text/plain:表示是文本类型;
application/xml:表示是xml类型;
multipart/form-data:表示是上传文件;
三. Response详解
1. 返回响应结果
Write方法:这种方式是直接写出数据,但是并没有关闭流;
end方法:这种方式是写出最后的数据,并且写出后会关闭流;
注:如果我们没有调用 end和close,客户端将会一直等待结果,所以客户端在发送网络请求时,都会设置超时时间
const http = require("http");
{
// 创建一个http对应的服务器
const server = http.createServer((request, response) => {
// response对象是个writeable可写流
// 方式1- write
response.write("hello1");
response.write("hello2");
// 方式2- end
response.end("请求成功了");
});
// 开启对应的服务器,并监听端口
server.listen(8082, () => {
console.log("----------8082端口的服务器下已经开启-------------");
});
}
2. 响应状态码
详见:https://developer.mozilla.org/zh-CN/docs/web/http/status
(1). response.statusCode = 401
(2). 通过writeHead方法
const http = require("http");
{
// 创建一个http对应的服务器
const server = http.createServer((request, response) => {
// response对象是个writeable可写流
// 方式1- statusCode
// response.statusCode = 401;
// 方式2- end
response.writeHead(403);
// response.end("请求成功了");
});
// 开启对应的服务器,并监听端口
server.listen(8082, () => {
console.log("----------8082端口的服务器下已经开启-------------");
});
}
3. 响应header
主要有两种模式
(1). res.setHeader:一次写入一个头部信息;
(2). res.writeHead:同时写入header和status;
const http = require("http");
{
// 创建一个http对应的服务器
const server = http.createServer((request, response) => {
// response对象是个writeable可写流
// 方式1- 单独设置header
response.setHeader("Content-Type", "text/plain;charset=utf8;");
// 方式2- http status code一起设置
// response.writeHead(200, {
// "Content-Type": "application/json;charset=utf8;",
// });
response.end("请求成功了");
});
// 开启对应的服务器,并监听端口
server.listen(8082, () => {
console.log("----------8082端口的服务器下已经开启-------------");
});
}
四. node中使用axios
1. 通过指令 【npm init】 初始化项目
2. 通过指令 【npm install axios】安装axios包
3. 使用即可
const axios = require("axios");
axios.get("http://localhost:8082").then(res => {
console.log(res.data);
});
五. 内置http发请求
在Node中,使用的是http内置模块,来发送http请求
(1). 直接调用get方法,发送get请求
const http = require("http");
{
http.get("http://localhost:8082", res => {
// 从可读流中获取数据
res.on("data", data => {
const dataString = data.toString();
console.log(dataString);
// const dataInfo = JSON.parse(dataString);
// console.log(dataInfo);
});
});
}
(2). 通过调用request方法,发送Post请求 (这种模式必须调用end,来结束请求)
const http = require("http");
const req = http.request(
{
method: "POST",
hostname: "localhost",
port: 8082,
},
res => {
res.on("data", data => {
const dataString = data.toString();
console.log(dataString);
// const dataInfo = JSON.parse(dataString);
// console.log(dataInfo);
});
}
);
// 必须调用end, 表示写入内容完成
req.end();
!
- 作 者 : Yaopengfei(姚鹏飞)
- 博客地址 : http://www.cnblogs.com/yaopengfei/
- 声 明1 : 如有错误,欢迎讨论,请勿谩骂^_^。
- 声 明2 : 原创博客请在转载时保留原文链接或在文章开头加上本人博客地址,否则保留追究法律责任的权利。