Node.js入门教程(二十八):GET/POST请求

Node.js入门教程(二十八):GET/POST请求 一、概述在很多场景中我们的服务器都需要跟用户的浏览器打交道如表单提交。表单提交到服务器一般都使用GET/POST请求。本章节我们将为大家介绍 Node.js GET/POST 请求的处理方式。二、获取 GET 请求内容由于 GET 请求直接被嵌入在路径中URL 是完整的请求路径包括了?后面的部分因此你可以手动解析后面的内容作为 GET 请求的参数。Node.js 中可以使用URL 构造函数解析请求的 URL。URL 对象是 Node.js 中用于解析和操作 URL 的一种标准工具。它提供了方便的接口来访问和修改 URL 的各个组成部分如协议、主机名、路径、查询参数等。示例解析 GET 请求const http require(http); const util require(util); http.createServer((req, res) { res.writeHead(200, { Content-Type: text/plain; charsetutf-8 }); // 使用 URL 构造函数解析请求的 URL const myUrl new URL(req.url, http://${req.headers.host}); // 输出 URL 的各个部分 res.end(util.inspect({ href: myUrl.href, origin: myUrl.origin, protocol: myUrl.protocol, host: myUrl.host, hostname: myUrl.hostname, port: myUrl.port, pathname: myUrl.pathname, search: myUrl.search, searchParams: Object.fromEntries(myUrl.searchParams) })); }).listen(3000); console.log(Server is running at http://localhost:3000);在浏览器中访问http://localhost:3000/user?name教程urlwww.runoob.com返回结果中会显示 URL 各个部分的解析结果。获取 URL 的参数我们可以使用searchParams.get()方法来获取 URL 中的查询参数const http require(http); http.createServer((req, res) { res.writeHead(200, { Content-Type: text/plain; charsetutf-8 }); // 使用 URL 构造函数解析请求 URL const myUrl new URL(req.url, http://${req.headers.host}); // 获取查询参数 const name myUrl.searchParams.get(name); const siteUrl myUrl.searchParams.get(url); res.write(网站名 (name || 未提供)); res.write(\n); res.write(网站 URL (siteUrl || 未提供)); res.end(); }).listen(3000); console.log(Server is running at http://localhost:3000);在浏览器中访问http://localhost:3000/user?name教程urlwww.chenbyte.com返回结果网站名教程 网站 URLwww.chenbyte.comURL 对象的属性和方法属性/方法描述示例输出href完整的 URL 字符串http://example.com:8080/path?foobaroriginURL 的源协议主机名端口http://example.com:8080protocolURL 的协议部分http:host主机名和端口号example.com:8080hostname主机名不包含端口号example.comport端口号如果指定8080pathname路径名部分/pathsearch查询字符串部分含??foobarsearchParamsURLSearchParams 对象{ foo: bar }hash锚点部分含##sectionURLSearchParams 方法方法描述示例get(name)获取指定名称的参数值searchParams.get(foo)append(name, value)追加新的参数searchParams.append(key, val)set(name, value)设置参数存在则更新searchParams.set(foo, new)delete(name)删除指定参数searchParams.delete(foo)has(name)判断参数是否存在searchParams.has(foo)forEach(callback)遍历键值对searchParams.forEach((v,k) console.log(k,v))toString()转换为字符串searchParams.toString()三、获取 POST 请求内容在 Node.js 中处理 POST 请求通常需要通过http模块来接收请求体中的数据。POST 请求数据不像 GET 请求那样包含在 URL 中而是作为请求体发送。接收 POST 数据的方式在 Node.js 中接收 POST 数据时需要监听并处理request对象的data和end事件事件说明data当数据块到达服务器时触发数据块作为回调的参数传递end当整个请求体接收完毕时触发这时可以对完整的 POST 数据进行处理示例处理 POST 请求const http require(http); // 创建 HTTP 服务器 http.createServer((req, res) { // 检查请求方法是否为 POST if (req.method POST) { let body ; // 监听 data 事件逐块接收数据 req.on(data, (chunk) { body chunk; // 累加接收到的数据块 }); // 监听 end 事件数据接收完毕 req.on(end, () { // 输出接收到的 POST 数据 console.log(Received POST data:, body); // 设置响应头和内容 res.writeHead(200, { Content-Type: text/plain }); res.end(POST data received successfully!); }); } else { // 非 POST 请求的处理 res.writeHead(405, { Content-Type: text/plain }); res.end(Only POST requests are supported.); } }).listen(3000, () { console.log(Server is running at http://localhost:3000); });测试 POST 请求可以使用curl命令来测试 POST 请求curl -X POST -d nameexampleage25 http://localhost:3000四、处理 JSON 数据如果 POST 请求发送的是JSON 数据可以在req.on(end)中将接收的数据解析为对象req.on(end, () { try { const parsedData JSON.parse(body); console.log(Received JSON data:, parsedData); res.end(JSON data received successfully!); } catch (err) { res.statusCode 400; res.end(Invalid JSON); } });五、使用 querystring 模块解析 POST 数据querystring模块用于处理 URL 查询字符串和 POST 请求的数据。对于application/x-www-form-urlencoded编码的 POST 请求数据如表单提交querystring模块可以帮助解析请求体将它转换成 JavaScript 对象。基本语法var http require(http); var querystring require(querystring); var util require(util); http.createServer(function(req, res) { // 定义了一个 post 变量用于暂存请求体的信息 var post ; // 通过 req 的 data 事件监听函数每当接受到请求体的数据就累加到 post 变量中 req.on(data, function(chunk) { post chunk; }); // 在 end 事件触发后通过 querystring.parse 将 post 解析为真正的 POST 请求格式 req.on(end, function() { post querystring.parse(post); res.end(util.inspect(post)); }); }).listen(3000);六、完整实例表单提交以下实例表单通过 POST 提交并输出数据var http require(http); var querystring require(querystring); var postHTML htmlheadmeta charsetutf-8title菜鸟教程 Node.js 实例/title/head body form methodpost 网站名 input namenamebr 网站 URL input nameurlbr input typesubmit /form /body/html; http.createServer(function(req, res) { var body ; req.on(data, function(chunk) { body chunk; }); req.on(end, function() { // 解析参数 body querystring.parse(body); // 设置响应头部信息及编码 res.writeHead(200, { Content-Type: text/html; charsetutf8 }); if (body.name body.url) { // 输出提交的数据 res.write(网站名 body.name); res.write(br); res.write(网站 URL body.url); } else { // 输出表单 res.write(postHTML); } res.end(); }); }).listen(3000);七、GET 与 POST 请求对比特性GETPOST数据位置URL 中查询字符串请求体中数据大小限制有URL 长度限制无可见性数据在 URL 中可见数据在请求体中不可见缓存可缓存不可缓存安全性较低数据暴露在 URL较高使用场景查询、获取数据提交、修改数据Node.js 获取方式解析req.url监听data和end事件八、本章小结知识点说明GET 请求数据在 URL 中使用URL构造函数解析查询参数POST 请求数据在请求体中通过data和end事件接收URL 对象提供searchParams操作查询参数querystring 模块解析application/x-www-form-urlencoded格式数据JSON 数据处理使用JSON.parse()解析 JSON 格式的 POST 数据提示在实际开发中推荐使用 Express 框架来处理路由和请求它提供了更简洁的req.query和req.body方法来获取 GET 和 POST 参数避免了手动解析的繁琐工作。