天天看点

Axios与SpringBoot参数交互方式Get请求Post请求总结与建议

Axios与SpringBoot的请求参数交互方法

  • Get请求
    • 普通类型参数、对象类型参数
      • 前端
      • 后台
        • 实体类
        • Controller
    • 数组、集合类型参数
      • 前端
      • 后台
  • Post请求
    • json类型传递
      • 前端
      • 后台
        • 实体类
        • Controller
    • x-www-form-urlencoded类型传递
      • 前端
      • 后台
    • x-www-form-urlencoded传递复杂对象集合的可行方案
      • 前端
      • 后台
  • 总结与建议
    • 总结
      • x-www-form-urlencoded
      • application/json
    • 建议

Get请求

普通类型参数、对象类型参数

前端

const params={
	username1:"5",
	password1:"6",
	username:"7",
	password:"8"
}
this.$http.get(`/index`,{
	params,
})
           

后台

实体类

public class User1 implements Serializable {
    private String username1;
    private String password1;
}
           

Controller

@GetMapping("/index")
public AjaxResult index(User1 user1, String username, String password){
      AjaxResult rs = new AjaxResult();
      System.out.println(user1);
      System.out.println(username);
      System.out.println(password);
      rs.setCode(200);
      return rs;
  }
           

qs模块在axios中存在,无需单独安装,如果报错,可通过npm install qs -S进行安装

注意:在/Index这个请求处理方法下,所有参数名、类中所有属性名不允许重复,重名则值会被覆盖

数组、集合类型参数

前端

const params={
	ids:['1','2','3','4','5','6','7'],
	listIds:['7','6','5','4','3','2','1']
}
this.$http.get(`/index`,{
	params,
	paramsSerializer: {
		serialize:function(params) {
			return qs.stringify(params, {arrayFormat: 'repeat',allowDots:false})
		}
	}
})
           

后台

@GetMapping("/index")
public AjaxResult index(
	@RequestParam("ids") String[] ids,
	@RequestParam("listIds") List<String> listIds){
	       AjaxResult rs = new AjaxResult();
	       for (String id : ids) {
	           System.out.println(id);
	       }
	       listIds.forEach(System.out::println);
	       rs.setCode(200);
	       return rs;
}
           

注意:此处的@RequestParam不可省略;不可传递类似List<User> users的复杂对象集合(需自定义参数解析器)

Post请求

json类型传递

前端

const data={
	users:[
		{
			username:1,
			password:2
		},
		{
			username:3,
			password:4
		}
	],
	username:5,
	password:6
}
this.$http.post(`/index`,data)
           

后台

实体类

public class RequestVo implements Serializable {
    private List<User> users;
    private String username;
    private String password;
}
           

Controller

@PostMapping ("/index")
 public AjaxResult index(@RequestBody RequestVo vo){
     AjaxResult rs = new AjaxResult();
     System.out.println(vo);
     rs.setCode(200);
     return rs;
 }
           

注意:

1. 一个@RequestMapping只能有一个@RequestBody

2. get请求没有请求体,不支持@RequestBody

x-www-form-urlencoded类型传递

前端

const data={
	ids:[1,2,3],
	username1:3,
	password1:4,
	username:5,
	password:6
}
this.$http.post(`/index`,data,{
	transformRequest: [function (data, headers) {
		return qs.stringify(data, {arrayFormat: 'repeat',allowDots:false});
	}],
})
           

后台

@PostMapping ("/index")
public AjaxResult index(
	User1 user1,
	String username,
	String password,
	@RequestParam("ids") List<String> ids){
	    AjaxResult rs = new AjaxResult();
	    System.out.println(user1);
	    System.out.println(username);
	    System.out.println(password);
	    ids.forEach(System.out::println);
	    rs.setCode(200);
    return rs;
}
           

注意:

1. 属性名、对象内的属性名不允许重复,重复会被覆盖

2. 通过该方式仍然不能传输List<User>这种复杂对象的集合

x-www-form-urlencoded传递复杂对象集合的可行方案

如果不想封装VO对象,使用@RequestBody接收数据,可采用如下方式传递List<User>这种复杂对象的集合。

前端

const users=[
	{
		username:1,
		password:2
	},
	{
		username:3,
		password:4
	}
]
const data = {
	users:JSON.stringify(users),
	username1:5,
	password1:6,
	username:7,
	password:8
}
this.$http.post(`/index`,data,{
	transformRequest: [function (data, headers) {
		return qs.stringify(data,{arrayFormat:'repeat',allowDots:false})
	}],
})
           

后台

@PostMapping ("/index")
public AjaxResult index(String users,User1 user1,String username,String password){
    AjaxResult rs = new AjaxResult();
    // com.alibaba.fastjson.JSONObject
    List<User> list = JSONObject.parseArray(users, User.class);
    list.forEach(System.out::println);
    System.out.println(user1);
    System.out.println(username);
    System.out.println(password);
    rs.setCode(200);
    return rs;
}
           

总结与建议

总结

x-www-form-urlencoded

  • 请求头支持以下3种内容的传递:

    1. 基本类型:如Integer、String、Boolean等

    2. 对象类型:如User等自定义类(只包含基本类型)

    3. 由基本类型构成的数组或集合:如List<String>、List<Long>等

  • 传递数组或集合时必须指定@RequestParam(“属性名”)
  • 传递的参数名和对象的属性名之间不允许重名,否则对象属性值会被覆盖

    例如:

public class User{
	public String username;
	public String password;
}
@GetMapping("/index")
public AjaxResult index(User user,String username,String password){
	//...
}
           

注意:上述写法会造成user对象被注入的username和password值不正确

application/json

  • 前台设置请求头为application/json;charset=utf-8后,直接发送数据即可
  • 后台将多个复杂参数封装为一个Vo对象,用@RequestBody接收即可
  • 仅post请求支持该方式,且一个RequestMapping只能有一个@RequestBody
  • 也可以通过Springboot自定义参数解析器实现@MultiRequestBody

建议

  • 不建议Get请求传List<User>这种复杂对象,建议传List<Long> ids,由后台进行查询
  • 不建议Post请求使用x-www-form-urlencoded类型传List<User>这种复杂对象,麻烦且容易丢失数据,建议封装Vo对象通过@RequestBody接收
  • axios可通过如下方式进行封装,统一处理参数:
// src/main.js
import Vue from 'vue'
import App from './App.vue'
import axios from 'axios'

// 根据需要2选1即可
//axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
//axios.defaults.headers.post['Content-Type'] = 'application/json;charset=utf-8';

/*
// get请求的参数处理器(x-www-form-urlencoded)
axios.defaults.paramsSerializer = {
	serialize:function(params) {
		return qs.stringify(params, {arrayFormat: 'repeat',allowDots:false})
	}
}

// post请求的参数处理器(x-www-form-urlencoded,后台如果用@RequestBody无需此部分)
axios.defaults.transformRequest = [function (data, headers) {
	return qs.stringify(data,{arrayFormat:'repeat',allowDots:false})
}]

Vue.prototype.$http=axios;

new Vue({
  render: h => h(App),
}).$mount('#app')

*/