Node.js GET/POST请求
在很多场景中,我们的服务器都需要跟用户的浏览器打交道,如表单提交和查询数据
查询数据,表单提交一般都是使用get请求GET/POST请求。
一.GET请求
由于GET请求直接被嵌入在路径中,URL是完整的请求路径,包括了?后面的部分,因此你可以手动解析后面的内容作为GET请求的参数。也就是说get请求的的参数,是跟随在URL后面的,浏览器的地址栏上的url就是get请求
解析参数:node.js 中 url 模块中的 parse 函数提供了这个功能。
//index.js
//引入http内置模块
const http=require("http");
const url=require('url');
//req 请求信息 res返回信息
const server=http.createServer((req,res)=>{
//设置状态码和响应头
res.writeHead(200, {
"Content-Type": "text/plain;charset=utf-8"
});
//排除掉 favicon.ico的处理
if (req.url === '/favicon.ico') {
return;
}
/**
* 解析 url 参数
* parse将字符串转成对象,req.url="/?name=zhangsan&age=18",
* true表示params是{name:"zhangsan",age:"18"},
* false表示params是name=zhangsan&age=18
*/
var params = url.parse(req.url, true).query;
//响应数据
res.write(`我的姓名是:${params.name},我的年龄是${params.age}`);
//结束响应
res.end();
});
server.listen(3000, function () {
console.log("服务启动成功");
});
在终端中定位到当前项目所在路径 ,然后命令 node index.js 服务启动成功,直接浏览器运行
http://localhost:3000?name=zhangsan&age=18 即可看到get请求输出的结果
POST请求
POST 请求的内容全部的都在请求体中,http.ServerRequest 并没有一个属性内容为请求体,原因是等待请求体传输可能是一件耗时的工作。
比如上传文件,而很多时候我们可能并不需要理会请求体的内容,恶意的POST请求会大大消耗服务器的资源,所以 node.js 默认是不会解析请求体的,当你需要的时候,需要手动来做。
//处理post请求
//引入http内置模块
var http = require("http");
//解析参数的内置模块
var querystring=require("querystring");
//创建web服务 req 请求信息 res返回信息
http.createServer((req, res) => {
//设置状态码和响应头
res.writeHead(200, {
"Content-Type": "text/html;charset=utf-8"
});
/**
* 监听事件
* eventName 要监听的事件的名字 (eventName 不是自己想的名字)
* callback 监听的这个事件被触发时要执行的回调函数
*
* req.on(eventName, callback)
*
* $('#btn').on('click', function(event) {
* // 这个回调的代码在用户真的去点击了这个 #btn 的按钮时才会触发
* })
*/
//定义了一个raw变量,用于暂存请求体的信息
let raw = "";
// 通过req的data事件监听函数,每当接受到请求体的数据,就累加到raw变量中
req.on("data", function (chunk) {
raw += chunk;
});
/**
* 监听 req 的 end 事件
*
* 这个end事件的回调函数是当整个请求体传输完成之后再触发的
*/
// 在end事件触发后,通过querystring.parse将post解析为真正的POST请求格式,然后向客户端返回。
req.on("end", function () {
//解决传输过来的参数中文乱码
raw = decodeURI(decodeURI(raw));
//解析参数raw
raw = querystring.parse(raw);
res.write(`我的名字是:${raw.username},年龄:${raw.age}`);
res.end();
});
}).listen(3000, () => {
console.log("启动服务");
});