路由和GET、POST传值
什么是路由
浏览器和web服务器之间的交互是通过HTTP协议,呈现给用户的网页一般是一个html文件,针对浏览器发出的不同请求,服务器返回不同的html文件。那么服务器怎么知道浏览器请求的是哪个html文件呢?
答案就是路由。路由是由url(路径)和请求方法组成的,用于服务器处理浏览器发出的请求并返回对应的数据。nodejs中可以利用url
模块来获取当前浏览器访问的pathname
,根据自定义的关系返回数据,比如浏览器访问http://www.baidu.com/login
此时的pathname
为/login
,那么就返回login.html,如果pathname
为/register
,那么就返回register.html。根据pathname返回对应的数据的操作就是路由。
这里以返回文字为例演示nodejs对路由的操作。
//路由演示程序,请手动输入以下url
// http://127.0.0.1:9999/login
// http://127.0.0.1:9999/register
// http://127.0.0.1:9999/loginout
let http = require("http");
let url = require("url");
let app = http.createServer((req, res) => {
let urlinfo = url.parse(req.url, true);
let pathname = urlinfo.pathname;
console.log("当前请求的路由是:", pathname);
let file = "";
if (pathname == "/favicon.ico") return;//如果是icon请求则不处理。
switch (pathname) {
case "/login":
file = "i am login.html"
break;
case "/register":
file = "i am register.html"
break;
case "/loginout":
file = "i am logiout.html"
break;
case "/":
file = "路由演示程序,请手动输入以下url: http://127.0.0.1:9999/login或者http://127.0.0.1:9999/register或者http://127.0.0.1:9999/loginout";
break;
default:
file = "请输入正确的路径";
break;
}
// let getValue = urlinfo.query;
// console.log("获取到的get值是:", getValue);
res.writeHead(200, { "Content-Type": "text/html;charset=UTF-8" })
res.write(file);
res.end();
})
app.listen(9999, "127.0.0.1")
console.log("路由演示服务器监听在 127.0.0.1:9999")
访问 http://127.0.0.1:9999/login
访问 http://127.0.0.1:9999/register
nodejs获取浏览器传值
HTTP协议中是浏览器与服务器之间通信的标准协议,通信过程中最常用的两个方法是:GET和POST方法。
- GET :一般用于从服务器拿数据,请求数据在URL中,是明文,不安全。
- POST :一般用于向服务器提交数据,请求数据不在url中,相对安全。
拿到GET传值
nodejs取get方法传值的方法是用前面介绍到的url
模块,url
模块的parse
方法能将一个请求分门别类的解析成一个对象,具体如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vcg7Xyt5-1575981456902)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20191210192352223.png)]
简单的server程序如下:
//获取get传值演示程序,请手动输入以下url
// http://127.0.0.1:9999/login?user="abc"&psd="123"
let http = require("http");
let url = require("url");
let app = http.createServer((req, res) => {
let urlinfo = url.parse(req.url, true);
let pathname = urlinfo.pathname;
console.log("当前请求的路由是:", pathname);
let data = "";
if (pathname == "/favicon.ico") return;//如果是icon请求则不处理。
switch (pathname) {
case "/":
data = "请输入 http://127.0.0.1:9999/login?user='abc'&psd='123'"
break;
case "/login":
let queryValue = urlinfo.query;
console.log("get拿到的值是:", queryValue);
data = `请在后台命令行查看拿到的值get值`;
break;
default: //如果是
data = "请输入正确的路径";
break;
}
// let getValue = urlinfo.query;
// console.log("获取到的get值是:", getValue);
res.writeHead(200, { "Content-Type": "text/html;charset=UTF-8" })
res.write(data);
res.end();
})
app.listen(9999, "127.0.0.1")
console.log("GET取值演示服务器监听在 127.0.0.1:9999")
拿到POST传值
因为post传值并不像get那样是在请求路径上显式传递,而是放在请求数据中,所以要拿到post传值就要比get稍微麻烦一些。
一般post传值的获取方式是通过http模块creatServer
函数中回调函数的req
参数的事件监听方法获取的(有点绕,具体看程序)。
另外补充一点req
参数的method
属性能得到对当前url的请求方法是get还是post。
看一个拿到post传值的例子(post传值利用postman软件来实现)。
//获取post传值演示程序,利用postman软件像本程序发送post请求
// http://127.0.0.1:9999/login?user="abc"&psd="123"
let http = require("http");
let url = require("url");
let app = http.createServer((req, res) => {
if (req.method.toLowerCase() == "post") {
console.log("这是一个post请求");
let postData = "";
//监听post数据
req.on("data", (dataChunk) => {
postData += dataChunk;//分块接受post数据(如果数据小一次就能接受完成)
})
req.on("end", () => {
console.log("接受到post数据为:", postData);
res.writeHead(200, { "Content-Type": "text/html;charset=UTF-8" })
res.write("成功取得post数据");
res.end();
})
}
})
app.listen(9999, "127.0.0.1")
console.log("POST取值演示服务器监听在 127.0.0.1:9999")