第八节: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 : 原创博客请在转载时保留原文链接或在文章开头加上本人博客地址,否则保留追究法律责任的权利。
 
posted @ 2023-02-09 08:35  Yaopengfei  阅读(237)  评论(1编辑  收藏  举报