3、Get请求和Post请求

474 阅读2分钟

一、Get请求和参数传递

Get请求的特点

通过URL来访问一个地址,比如http://127.0.0.1:7001,这种请求方式就是Get请求。Get请求也是我们最常用的请求方式。包括现在的扫码请求,其实也是变相的Get请求。

  • 优点:使用简单,清晰有条例。适合网站和对外App的使用。
  • 缺点:传递参数是有大小限制,安全性较差,不能完成重要数据的传递。

既有优点,又有缺点,所以就要根据具体的使用情况,而选择使用哪种请求方式。

1. 自由传参模式

Get请求我个人把它分为两种传参模式,一种是自由传参模式。这种传参模式和最早的传参模式相同。传递的参数个数和名称没有具体明确定义,设置不限制你是否传递参数。使用起来非常的灵活,所以就叫做自由传参模式。

/app/controller/jspang.js文件中编写

'use strict';

const Controller = require('egg').Controller;

class HomeController extends Controller {

  async gettest() {
    const { ctx } = this;
    ctx.body = ctx.query; //ctx.query获取到传递参数对象
  }
  
}

module.exports = HomeController;

/app/router.js文件添加路由

  router.get('/gettest', controller.home.gettest);

访问http://127.0.0.1:7001/gettest?id=1&name=xiaoming

image.png

2. 严格传参模式

和自由传参模式对应的就是严格传参模式,也就是传递的参数个数是固定的,传递参数顺序是固定的,传递的参数名称是固定的。

Get的严格传参模式需要配合router.js文件进行设置

  router.get('/gettest2/:id/:name', controller.home.gettest2);

ctx.params是获取所有的传递参数,ctx.params.name是获取传递参数的name值。

这时候的访问URL不在是用?来开始传递参数了,而是直接用/ 左斜杠来传递。

'use strict';

const Controller = require('egg').Controller;

class HomeController extends Controller {

  async gettest2(){
    const { ctx } = this;
     ctx.body = 'id:' + ctx.params.id + '-----name:' + ctx.params.name;
  }
  
}

module.exports = HomeController;

访问http://127.0.0.1:7001/gettest2/1/xiaohong

image.png

二、Post请求和参数接收

POST是在开发中经常使用的请求方式,比如表单数据的传递和图片的上传,都需要用到POST请求。这些是GET请求无法完成的。

安全设置解除

当你第一次请求时,可能会返回403错误,这是因为Egg.js默认开启了CSRF安全策略,学习阶段,我们可以关闭掉这个选项。

CSRF的全名为 Cross-site request forgery, 它的中文名为 伪造跨站请求。

关闭方法是,打开/config/config/default.js文件,也就是项目的默认配置文件。

然后设置配置项,关闭掉CSRF

// 允许跨域
  config.security = {
    csrf: {
      enable: false,
    },
  };

能发送POST请求后,需要在服务端接收请求。直接使用ctx,request.body来获取。

// post请求
  async posttest() {
    const { ctx } = this;
    ctx.body = {
      status: 200,
      data: ctx.request.body,
    };
  }

配置路由

router.post('/posttest', controller.home.posttest);

使用postman这类工具进行访问post请求

image.png

学习日期:2021/12/23

视频参考www.bilibili.com/video/BV1s3…

文档参考jspang.com/detailed?id…

仅供个人学习和记录