8

axios&spring前后端分离传参规范总结

 2 years ago
source link: https://www.fly63.com/article/detial/11967
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

前后端分离开发的场景下,开发人员的工作内容更加专注与专业,但是也产生了一些额外的沟通成本。比如:本文中为大家说明的前后端参数传递与接受方法。本文主要是面对前端使用axios,后端使用Spring进行参数接受的情况进行说明。在使用spring的时候,与前端配合开发,容易出现传参歧义的2个注解是

  • @RequestParam 注解,默认接收 Content-Type: application/x-www-form-urlencoded 编码格式的数据
  • @RequestBody 注解,默认接收JSON类型格式的数据。

很多的文章列举出参数传递失败的问题解决方案,在我看来都不够全面。在此我给大家总结一下

一、 @RequestParam 注解对应的axios传参方法

以下面的这段Spring java代码为例,接口使用POST协议,需要接受的参数分别是tsCode、indexCols、table。针对这个Spring的HTTP接口,axios该如何传参?有几种方法?我们来一一介绍。

@PostMapping("/line")
public List<? extends BaseEntity> commonEChart(@RequestParam String tsCode,
   @RequestParam String indexCols,
   @RequestParam String table){

1.1.params传参(推荐)

使用axios实例的params进行传参,就会将params参数格式化为x-www-form-urlencoded的格式,与后端参数一一对应即可传参成功。这也是我向大家推荐的传参方法!

return request({
    url: '/chart/line',
    method: 'post',
    params: {   //注意这里的key是params
        tsCode,
        indexCols,
        table
    }
})

1.2.FormData传参

还可以使用js的FormData对象进行参数格式化,同样可以在Spring后端正确的使用 @RequestParam 注解进行参数接收。

let params = new FormData();
params.append('tsCode', tsCode);
params.append('indexCols', indexCols);
params.append('table', table);
return request({
    url: '/chart/line',
    method: 'post',
    data: params   //注意这里的key是data
})

1.3. qs.stringfy 传参

还可以使用 qs.stringfy 进行参数格式化,同样可以在Spring后端正确的使用 @RequestParam 注解进行参数接收。

import qs from "qs";

return request({
    url: '/chart/line',
    method: 'post',
    data: qs.stringify({    //注意这里的key是data
        tsCode,
        indexCols,
        table
    })
})

需要注意的是使用这种方法,需要手动设置header(Content-Type)

const service = axios.create({
    headers: {
        "Content-Type": "application/x-www-form-urlencoded"
    }
});

二、 @RequestBody 的axios传参方法

java代码部分如下所示,DemoModel类是一个实体类,包含名称tsCode,indexCols,table三个字符串成员变量。接收到的JSON格式参数会自动为demo对象的成员变量赋值。

@PostMapping("/line")
public List<? extends BaseEntity> commonEChart(@RequestBody DemoModel demo){

@RequestBody 注解,默认接收JSON类型格式的数据。在axios中默认data传参就会默认使用JSON数据格式,所以不用额外的特殊处理。

return request({
    url: '/chart/line',
    method: 'post',
    data: {    //注意这里的key是data
        tsCode,
        indexCols,
        table
    }
})

字母哥博客: zimug.com

链接: https://www.fly63.com/article/detial/11967


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK