05 路由和GET、POST传值

路由和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

C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20191210195745696.png
访问 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")

C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20191210201833442.png

拿到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")

在这里插入图片描述
C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20191210203706946.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值