1.1请求参数
当客户端向服务器端做出请求时,需要额外的携带一些数据,这些数据需要通过请求参数传递过去。
例如:①常见的登录操作,用户在表单中输入用户名和密码后,需要登录,而用户名和密码需要通过某种形式传递到服务器端,服务器端要获取到用户输入的内容,因为服务器端要验证。
是怎样一个传递过程呢?
答:通过请求参数传递过去。
②在网站的后台发布一些文章的信息,我们要在表单中,输入文章的标题,文章的发布日期,文章的封面以及文章的内容,那么这些在表单当中输入的信息,也是通过请求参数传递给服务端的。
请求参数分为两种:GET,POST
1.2GET请求参数
参数被放置在浏览器地址栏中,例如:
http://localhost:3000//?name=zhangsan&age=20
?代表后面就是请求的参数,就是我们需要额外携带的数据,数据实际上就是键值对,以=进行分割,如果想要传递多个信息,以&符进行分割。
服务器端获取这个请求参数,怎么获取,通过name或者age去获取具体的zhangsan或者说20.
①要获取,首先要在客户端请求时传递,
②切换到浏览器,在地址栏中输入一个/index?name=zhangsan&age=20(回车发送请求)
③返回:not found
输出req.url
console.log(req.url)
命令行工具显示:/index?name=zhangsan&age=20
怎么得到req.url中的请求参数得到。
①字符串截取(麻烦)
②node.js中提供了内置模块,让我们通过内置模块的方法处理这个请求参数
在node.js提供了内置模块url模块
const url = require('url'); // 用于处理url地址
url.parse(req.url) // 解析:最终返回一个对象
console.log(url.parse(req.url));
其中:search,query
pathname
处理后还是不方便,
parse(req.url,true); // 1要解析的url地址2将查询参数解析成对象形式
console.log(url.parse(req.url,true));
浏览器中刷新页面,切换到命令行窗口观察:
query:{name:'zhangsan',age:'20'}
获取请求参数
let params = url.parse(req.url,true).query;
console.log(params.name);
console.log(params.age);
刷新浏览器,切换命令行工具:获取到了zhangsan,20
!!!之前写的判断,在加了查询参数后失效,,要判断什么?判断客户端的请求地址。
req.url既有请求地址,又有请求参数,所以这时候不能拿req.url直接去判断。
获取到pathname:去做判断
let {query,pathname} = url.parse(req.url,true);
if(pathename == '/index' || pathname == '/'){
res.end('<h2>欢迎来到</h2>');
}else if(pathname == '/list' ){
res.end('welcome to listpage');
}else{
res.end('not found');
}
1.3POST请求参数
①怎么样从客户端发送请求参数到服务端、
②如何在服务器端接收这些请求参数
切换到form.html中,在form标签中
<input type="text" name="username">
<input type="password" name=" password ">
<input type="submit">
当用点击提交按钮,把用户名和密码提交到服务端,要如何接收参数呢(GET请求服务器端是通过参数的名字去接收的,POST请求也不例外),在input上有个name属性,用来指定当前这个表单项的名字,那么把第一个指定成username,第二个指定成password保存.
GET请求参数是放在地址栏中进行传输的,POST请求参数不在地址栏中,而在请求报文中。
右键在浏览器中打开当前页面,在浏览器控制台打开Network,输入用户名以及密码,点击提交。
出现Headers中出现Form Data在这里出现了username,password。(浏览器为了让我们更加明白清楚的观察这个参数,实际上把POST参数做了显示上的优化,实际上格式和GET餐护士格式一样,点击view source,现在看到的格式就一样了)
②服务器端接收参数
新建文件post.js
const http =require('http');
const app =http.createServer();
const querystring = require('querystring'); // 处理请求参数模块
app.on('request',(req,res)=>{
// post参数是通过事件的方式接收的
// data 当请求参数传递的时候触发data事件
// end当参数传递完成的时候触发end事件
let postParams = '';
req.on('data',params=>{
postParams+=params;
});
req.on('end',()=>{
// console.log(postParams);
console.log( querystring.parse(postParams) );
});
res.end('OK');
});
app.listen(3000);
console.log('网站服务器启动成功')
PS:post参数在理论上数据量是无限的,所以作为服务器为了减轻压力,post参数不是一次就可以接收完的,比如说传递了个100M的数据,可能分10次接收,每次就收10M,当要请求参数传输时,就会触发data事件,当请求参数传递完成的时候触发end事件。
切换到命令行:node post.js // 启动网站服务器
const querystring = require('querystring'); //node.js中的内置模块:处理请求参数模块
该模块中有一个方法parse,能将字符串转成对象模式
切换到浏览器中,输入用户名,密码。提交,控制台中就有一个对象,有这个请求参数
小结:·对于POST请求参数而已,它的参数是被放置在请求体中进行传输的,所谓请求体就是放在了请求报文中参数,而GET请求参数,是被放在了地址中传输。
·获取POST请求参数要用到data事件以及end()事件。而获得GET参数使用req.url就可以了。
·获取到POST参数依然是一个字符串格式,要把他转换成对象形式,就要使用内置模块querystring,在这个模块下有一个方法parse,他可以把字符串类型的请求参数转换成对象类型。