http
Node内置的http模块功能使得它非常适合用来开发Web程序。与apache不同,apache为静态服务器,用于将浏览器端请求的静态资源返回。而http模块可以开发动态接口,用于处理前端业务,比如登录,注册,查询资讯信息等。
使用流程:
- 引入http模块
- 创建服务对象
- 在创建的服务对象中编写需要执行的操作代码
- 打开服务并对创建的服务对象进行监听或者其他操作
创建:http.Server
http.createServer()表示创建一个服务,该函数的返回值为http.Server的实例。
var server = http.createServer(function(req, res){}
函数:
server.listen()打开服务,并且监听端口
erver.close()关闭服务
事件:
server.on(‘close’,callback)当服务关闭,执行callback函数
server.on(‘error’,callback)当服务发送错误,执行callback函数
server.on(‘connection’,callback)当服务连接后,执行callback函数
server.on(‘timeout’,callback)监听超时调用函数,当超时调用函数执行时,执行callback函数
编写服务对象内执行函数:http.IncomingMessage
HTTP服务器接收到的客户端请求时调用的回调函数中的第一个参数值为一个http.IncomingMessage对象,该对象用于读取客户端请求流中的数据。
当从客户端请求流中读取到新的数据时触发data事件,当读取完客户端请求流中的数据时触发end事件
属性:
eq.method 请求方法
req.url 请求url
req.headers 请求头
req.httpVersion 请求版本号
req.socket 底层socket连接对象
事件:
req.on(‘data’,callback)用于监听data函数,是否有读取新数据
req.on(‘end’,callback) 监听是否读取完毕
示例一:简单的链接过程
var http = require("http");
//引入http服务
//创建服务对象
var server = http.createServer(function(req, res) {
var url = req.url;
var method = req.method;
console.log(url, method);
});
//启动并监听端口
server.listen(8080, function() {
console.log("8080端口监听成功---");
});
server.on('connection', function() {
console.log("服务器连接成功");
});
运行代码之后使用浏览器访问本地127.0.0.1:8080/student?name="lisi’,可以看到控制台输出的监听内容。
====================================================================================
分割线
参数获取
get方法:
示例一中,我们的访问为get请求,如何通过http获取请求中的数据?
这里我们可以使用node中的另外一个内置模块,url中的parse进行一个转换。(url在第一篇笔记中有介绍)
var http = require("http");
//引入http服务
var urlMoudule = require("url");
//引入url模块
//创建服务对象
var server = http.createServer(function(req, res) {
var url = req.url;
var method = req.method;
var urlObj = urlMoudule.parse(url);
//使用url模块中的parse方法将url转换为一个对象
console.log(urlObj);
});
//启动并监听端口
server.listen(8080, function() {
console.log("8080端口监听成功---");
});
server.on('connection', function() {
console.log("服务器连接成功");
});
这里执行代码再访问http://127.0.0.1:8080/students?name=23&age=123,
可以看到控制台打印出了一个url对象,这里的query就是我们需要获取的请求数据。
但是请求数据是一个查询字符串,如果需要转换成为对象,可以使用node内置querystring模块中的parse方法来转换。在此之前请记得在文件头var qs = require(“querystring”)引入query string模块
var url = req.url;
var urlObj = urlMoudule.parse(url);
var query = urlObj.query;
query = qs.parse(query);
console.log(query);
//[Object: null prototype] { name: '23', age: '123' }
post方法:
get的请求数据是基于请求数据存放在url后面使用?连接,如果是post我们就无法从url中获取到请求数据。
这里我们需要使用到一个监听和buffer模块。
buffer模块为全局模块,不需要单独引入。
首先写一个简单的html的form页面,将请求设置为post
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<form action="http://127.0.0.1:8080/students" method="POST">
姓名:<input type="text" name="name" id=""><br> 年龄:
<input type="text" name="age" id=""><br>
<input type="submit" name="" id="">
</form>
</body>
</html>
使用一个if来判断请求为post或get
var http = require("http");
var urlMoudule = require("url");
var qs = require("querystring")
//创建服务对象
var server = http.createServer(function(req, res) {
// console.log(req);
var url = req.url;
var method = req.method;
var urlObj = urlMoudule.parse(url);
// console.log(urlObj, method);
var query = urlObj.query;
var pathname = urlObj.pathname;
query = qs.parse(query);
res.writeHead(200, "ok", {
"content-type": 'text/plain;charset=utf-8'
});
console.log(query, pathname);
if (method == 'GET') {
console.log(query);
} else {
var buffer = Buffer.alloc(0)
//新建一个buffer
req.on("data", function(data) {
//使用监听,当获取到新数据时,将其加入到buffer中
buffer += data;
req.on("end", function() {
//当不再获取新数据时,使用buffer模块中的tosrting方法将buffer转换为string类型,
//并用querystring中的parse将查询字符串转换为对象
console.log(qs.parse(buffer.toString()));
//[Object: null prototype] { name: '23', age: '123' }
})
})
}
});
//监听端口
server.listen(8080, function() {
console.log("8080端口监听成功---");
});
server.on('connection', function() {
console.log("服务器连接成功");
});

本文详细介绍了Node.js内置的http模块,重点讲解如何从req.url中获取请求参数。通过创建http服务器,监听事件,利用http.IncomingMessage对象的属性如req.url、req.headers等获取请求信息。此外,还探讨了GET和POST请求中参数的获取方法,对于GET请求,可通过url.parse和querystring.parse转化查询字符串;对于POST请求,需要监听请求体数据并使用Buffer模块处理。
1万+

被折叠的 条评论
为什么被折叠?



