请求参数:
客户端向服务器端发送请求时,有时需要携带一些客户信息,客户信息需要通过请求参数的形式传递到服务器,比如常见的登录操作。
用户在表单中输入用户名和密码之后,需要登录,用户名和密码是要通过某种形式传递给服务器端的,服务器端要获取到用户输入的这个内容,因为服务器端要去做验证,那用户名和密码如何传递给服务器端呢?就是用请求参数传递过去。
请求参数分为两种:
1. GET请求参数
2. POST请求参数
先看GET请求参数:
参数被放置在浏览器的地址栏中,例如:http://localhost:3000/?name=lisi&age=21
?后面代表的就是请求的参数,也就是需要额外携带的数据,作为服务器端想要获取这个请求参数,要通过name和age获得lisi和21两个值。
因为请求参数在地址栏中,因此我们可以通过req.url获取到。
// 引入系统模块http
const http = require('http');
// 创建web服务器
const app = http.createServer();
// 用request添加服务器请求事件
app.on('request',(req,res) => {
// 获取到url
console.log(req.url);
// 修改内容类型为html 编码格式为urf8
res.writeHead(200,{
'content-type':'text/html;charset=utf8'
})
if(req.url == '/index' || req.url == '/'){
res.end('Welcome to Homepage欢迎来到首页~');
}else if(req.url == '/list'){
res.end('Welcome to Listpage欢迎来到列表页~');
}else {
res.end('Not Found抱歉,没有找到相关页面');
}
})
app.listen(3000);
console.log('网站服务器启动成功');
获取到的url信息如下:
但获取到信息过长,不方便做语法判断,我们需要拿到请求参数。在node.js中提供了内置模块,可以通过内置模块下的方法来处理这个请求参数,如下:。
// 内置模块url专门用来处理url地址
// 在url内置模块下有一个方法:parse()方法
// 它有两个参数,第一个参数是要解析的url
// 第二个参数是把查询参数转换成对象形式,true/false
const url = require('url');
url.parse(要解析的url,true);
解析后的url如下:
在query中存放了name和age数据,那么就可以通过对象.属性的方法获取到参数了。
完整操作代码示例:
// 引入系统模块http
const http = require('http');
// 引入url内置模块
const url = require('url');
// 创建web服务器
const app = http.createServer();
// 用request添加服务器请求事件
app.on('request',(req,res) => {
// 获取到url
console.log(req.url);
// url下的parse方法解析url 有两个参数
const params = url.parse(req.url,true).query;
// 输出query对象中的name和age
console.log(params.name);
console.log(params.age);
})
app.listen(3000);
console.log('网站服务器启动成功');
执行后结果如下:
再看POST请求参数:
我们知道GET请求的请求参数是放在地址栏中传输的,而POST请求的请求参数在请求报文当中。
Form Data中存储的就是POST请求参数,点击view source,可以发现POST请求参数的格式和GET请求参数的格式是一样的,只不过GET请求参数放在了地址栏中,POST请求参数放在了请求报文中。
点击view source后:username=Alice&userpsd=123456
由于POST参数没有存储在地址栏中,所以不能用req.url获取,POST参数是通过事件的方式接收的,事件分别是data和end事件,由于POST参数在理论上数据量是无限的,所以服务器为了减轻压力,POS请求参数不是一次就接收完的,比如传了100兆的数据,它不会一次性接收,可能会分为10次。
当有请求参数传输的时候,会触发data事件,当请求参数传递完成时,会触发end事件。
使用querystring系统模块可以将参数转换为对象格式,querystring有一个parse方法,querystring.parse()就可以将字符串转换为对象格式了。
操作代码示例:
// 先引入系统模块http
const http = require('http');
// 用于处理字符串的第三方模块
const querystring = require('querystring');
// 创建web服务器
const app = http.createServer();
app.on('request',(req,res) => {
// 请求参数是和请求相关的信息,所以用到req对象
// 在req的身上绑定data和end事件
// 因为POST参数不是一次性接收完的,所以先声明个变量用来拼接
let postparams = '';
req.on('data',(params) => {
postparams += params;
})
req.on('end',() => {
// querystring.parse()方法可以把字符串转换成对象格式
console.log(querystring.parse(postparams));
// 如果直接输出console.log(postparams); 结果是个字符串
})
// 对于客户端的每次请求,服务器端都要去做出响应,否则客户端将处于等待状态
res.end('OK');
})
app.listen(3000);
console.log('网站服务器启动成功');
执行结果如下:
如果不使用querystring.parse()方法,而是直接输出,结果就是第一个红色箭头指向,是一个字符串,使用querystring.parse()方法后,结果就是第二个红色箭头指向,转换成了对象格式。