SpringBoot和Vue接口调用传参方式

本文详细介绍了前后端项目中GET和POST请求的常见传参方式,包括QueryStringParameters、FormData和RequestPayload。重点讲解了axios封装方法以及SpringBoot中@RequestParam和@RequestBody注解的使用,还涉及了路径变量的处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简单总结一下常用的传参方式,一些前后端分离项目接口调试时经常出现传参格式错误问题。
前后端进行交互时方法一般就分为get和post,至于后面的delete和put都是基于post进行封装而出的。

Http请求中不同的请求方式会设置不同的Content-Type,参数的传递方式就会不一样,主要分为以下三种:Query String ParametersForm DataRequest Payload

下面使用的axios请求都是经过封装的,文章最后有对应的封装方法

GET请求

我们发送get请求时,参数是通过url的形式进行传递,即url中?后面拼接的参数,以&做连接,参数直接表现在url中。
例如:http://localhost:8801/api/selectDetail?id=1&userName="zhang"
前端通过query String parameters 方式传参,axios中指明使用params

export function selectList(params) {
  return request({
    url: 'api/xxx/selectList',
    method: 'get',
    params
  })
}

POST请求

Post请求有两种传递参数的形式:form datarequest payload的形式
发起post请求时若未指定content-type,则默认content-type为application/x-www-form-urlencoded,参数是在请求体中,参数以form data的形式传递,不会出现在请求的url中。

若content-type为application/json,则参数会以request payload的形式进行传递,数据格式为json形式,请求表单的参数在request payload中,不会出现在请求的url中,使用原生的Ajax post请求不指定请求头默认的参数就是出现在request payload中。
前端通过formData方式传参,axios中指明使用data

export function selectList(data) {
  return request({
    url: 'api/xxx/selectList',
    method: 'post',
    data
  })
}

前端通过request payload方式传参

export function selectList(data) {
  return request({
    url: 'api/xxx/selectList',
    method: 'post',
    data
  })
}

SpringBoot注解对应传参方式

@RequestParam() 默认接收application/x-www-form-urlencoded编码格式的参数
@RequestBody() 默认接收json格式的参数

  1. spring通过 @requestParam (queryParam)(路径传参-默认传参注解)接收的参数都是url拼接 将参数放到query String parameters,前端可以通过下面三种方式传参
    • params 传参 (推荐) – params
    • formData传参 – data (需要修改Content-Type)
    • Qs传参 – data ,需要手动处理header “Content-Type”: “application/x-www-form-urlencoded”

spring boot接口

@GetMapping(value = "/hello")
    public ResponseEntity getUser(@RequestParam String username){  
}
//http://lcoalhost:8080/hello?username=1111

axios调用

#params 传参
export function find(params){
  return request({
    url: `${API}/info/find`,
    method: 'get',
    params:params
  })
}
  1. spring通过@requestBody,通过post提交消息主体中参数,参数值为json格式,默认就是json格式不需要进行处理
  • 通过data传参

springboot 接口

@PostMapping
public ResponseEntity<Record> add(@RequestBody Record record) {
    return ResponseEntity.ok(this.recordService.insert(record));
}

axios调用方法(这里的axios是经过封装后的)

export function add(data){
  return request({
    url: `${API}/record/add`,
    method: 'post',
    data
  })
}

请求信息:

POST http://localhost:5138/record/
Content-Type: application/json
--- 参数内容
{
  "objective": 1.0,
  "objRate": 1.0,
  "objDate": "2022/1/8 12:05:00",
  "outputPrice": 1.0,
}
  1. @pathVariable(@pathParam)url路径中参数
  • 拼接url

springboot接口

@DeleteMapping(value = "/job/{id}")
    public ResponseEntity delete(@PathVariable(value = "id", required = false, defaultValue = "0") Long id){
}
//http://localhost:8080/job/1

axios调用

export function queryById(id){
  return request({
    url: `${API}/info/queryById/${id}`,
    method: 'get'
  })
}

axios对应的封装方法

// 封装axios:使用请求与响应拦截器
import axios from 'axios'
import { ElMessage, ElMessageBox } from 'element-plus'
// 引入qs
import qs from 'qs'
import useUserStore from '@/store/modules/user'

// 利用axios对象的create方法,创建axios实例(其他的配置:基础路径、超时时间)
const service = axios.create({
  //基础路径
  baseURL: '/',
  timeout: 5000, // 超时时间的设置
})
// 第二步:request实例添加请求与响应拦截器
service.interceptors.request.use((config) => {
  // 获取用户仓库内的token,登录成功后携带公共参数
  let userStore = useUserStore()
  if(userStore.token) {
    config.headers['Authorization'] = userStore.token
  }
  return config
})

// 第三步:配置相应拦截器
service.interceptors.response.use(
  (response) => {
    // 获取返回成功数据的状态码code和错误信息message
    const { code, message } = response.data;
    if(code) {
      // 有状态码判断是否为200,除此皆为异常响应
      if(code == 200) {
       return response.data
      }
      else if (code < 200 || code > 300) {
        ElMessage({
          message: message || '系统出错',
          type: 'error'
        });
        return Promise.reject('error')
      }
      else {
        // 其他类型的状态码
        ElMessage.error(message)
        return Promise.reject(response.data)
      }
    } else {
      // 未返回状态码直接返回响应信息
      ElMessage.error('系统服务连接失败')
      return Promise.reject(response)
    }
  },
  (error) => {
    // 失败的回调:处理http网络错误
    //定义一个变量:存储网络错误信息
    let message = ''
    if(error.code === 'ECONNABORTED') {
      message = '连接超时中止,请稍后重试!'
    } else {
      // http状态码
      const status = error.response.status
      switch (status) {
        case 401:
          message = '无权访问'
          break
        case 404:
          message = '请求地址错误'
          break
        default:
          message = '网络出现问题'
          break
      }
    }
    // 提示错误信息
    ElMessage({
      type: 'error',
      message,
    })
    return Promise.reject(error)
  },
)


// 利用axios对象的create方法,创建axios实例(其他的配置:基础路径、超时时间)
interface ReqParamsType {
  url:string
  data?: any
  params?:any
  method?:string,
  type?:string
  timestamp?:boolean
  timeout?:number
}
const request = ({
   url,
   data,
   params,
   method= 'post',
   type='json',
   timestamp = false,
   timeout,
 }:ReqParamsType): Promise<T> => {
  let config = {
    method,
    url,
    baseURL: '/',
    withCredentials: true,
    responseType: 'json',
    headers: {
      'Access-Control-Allow-Origin': '*',
      'X-Requested-With': 'XMLHttpRequest'
    },
    timestamp: timestamp,
    timeout: timeout
  };
  if (method === 'get') {
    if (timestamp) {
      config.url += config.url.indexOf('?') > 0 ? '&' : '?';
      config.url += `timestamp=${+new Date()}`;
    }
    Object.assign(config, {
      params
    });
  }
  else {
    if (type === 'form') {
      config.headers['Content-Type'] = 'application/x-www-form-urlencoded';
      Object.assign(config, {
        data: qs.stringify(data)
      });
      config.url = config.url+'?'+qs.stringify(data)
    } else if (type === 'json') {
      config.headers['Content-Type'] = 'application/json';
      Object.assign(config, {
        data: data
      });
    } else if (type === 'formData') {
      let formData = new FormData();
      for (let i in data) {
        if(data[i] != null) {
          formData.append(i, data[i]);
        }
      }
      config.headers['Content-Type'] = 'multipart/form-data';
      Object.assign(config, {
        data: formData
      });
    }else if(type === 'picture'){
      config.headers['Content-Type'] = 'application/x-www-form-urlencoded';
      Object.assign(config, {
        data: data
      });
    }
    if(timestamp) {
      const code = `${(new Date()).getTime()}_${Math.round(Math.random()*10000)}`
    }
  }
  return new Promise((resolve, reject) => {
    service(config).then((response) => {
      resolve(response);
    }, (error) => {
      reject(error);
    }).catch((error) => {
      reject(error);
    });
  });
}
// 对外暴露
export default request
<think>好的,我现在需要帮助用户了解在Spring Boot中如何从前端接收参数并在后端处理。用户希望得到具体的示例方法。首先,我应该回忆一下Spring Boot中处理前端参数的常用方式。根据用户提供的引用内容,特别是引用[2]引用[4],提到了使用@RequestParam、@PathVariable@RequestBody等注解。 首先,我需要分情况讨论不同的传参方式。比如,GET请求通常使用查询参数或路径参数,而POST请求可能会发送表单数据JSON数据。引用[2]中的例子是前端用axios发送POST请求,参数是对象形式,后端用@RequestParam接收,但这里可能需要处理参数名称不一致的情况,比如用@RequestParam(value="first_name") String firstName。另外,引用[4]提到接收JSON数据需要使用@RequestBody,将整个JSON对象映射到后端的Java对象上。 接下来,我需要确保覆盖常见的接收参数方式,包括: 1. URL查询参数(@RequestParam) 2. 路径参数(@PathVariable) 3. 表单数据(@ModelAttribute或直接使用对象) 4. JSON数据(@RequestBody) 同时,用户提供的引用[1]提到统一处理参数的方法,比如自定义PageParam类,但用户可能更需要基础示例,所以应该先介绍基本方法,再提到高级处理方式。不过用户的问题主要是请求示例,所以重点放在基本方法上。 然后,我需要为每种传参方式编写示例代码。例如,对于@RequestParam,可以展示一个接收多个查询参数的控制器方法。对于@PathVariable,展示如何在URL路径中使用变量。对于表单数据,可以用POST请求对象接收。对于JSON数据,使用@RequestBody对应的DTO类。 此外,需要注意参数名称匹配的问题,如引用[2]中提到的,如果前端参数名后端不一致,可以使用@RequestParam的value属性指定前端参数名。同样,在JSON映射时,字段名需要与DTO的属性名一致,或者使用@JsonProperty注解。 最后,要提醒用户常见的错误,比如忘记添加@RequestBody导致接收不到JSON数据,或者参数名称不匹配导致的400错误。同时,可以引用相关的引用来源来支持说明,比如引用[4]中提到的常见错误问题。 总结步骤: 1. 分四种传参方式介绍 2. 每种方式给出前后端代码示例 3. 强调注解的使用注意事项 4. 提及统一处理参数的优化方法,如引用[1]中的PageParam 5. 生成相关问题,帮助用户深入理解</think>以下是Spring Boot前端递参数与后端接收的详细方法及示例: ### 一、接收参数的四种主要方式 #### 1. URL查询参数(@RequestParam) *适用场景*:GET请求递简单参数 ```java @GetMapping("/user") public String getUser(@RequestParam("id") Integer userId, @RequestParam(defaultValue = "guest") String role) { return "用户ID:" + userId + " 角色:" + role; } ``` 前端调用示例: ```javascript axios.get('/user?id=123&role=admin') ``` #### 2. 路径参数(@PathVariable) *适用场景*:RESTful风格URL ```java @GetMapping("/product/{category}/{id}") public String getProduct(@PathVariable String category, @PathVariable Long id) { return "分类:" + category + " 产品ID:" + id; } ``` 前端调用示例: ```javascript axios.get('/product/electronics/789') ``` #### 3. 表单数据(@ModelAttribute) *适用场景*:统表单提交 ```java @PostMapping("/register") public String register(@ModelAttribute User user) { return "注册成功:" + user.getUsername(); } ``` 前端调用示例: ```html <form method="post" action="/register"> <input name="username" value="test"> <input name="email" value="test@example.com"> </form> ``` #### 4. JSON数据(@RequestBody) *适用场景*:现代前后端分离架构 ```java @PostMapping("/create") public ResponseEntity<?> createUser(@RequestBody UserDTO user) { // 处理逻辑 return ResponseEntity.ok("创建成功"); } ``` 前端调用示例(Vue): ```javascript axios.post('/create', { username: 'john', password: '123456', age: 25 }) ``` ### 二、参数处理优化建议 1. **统一参数格式**:推荐使用JSON格式进行复杂参数递[^4] 2. **自动参数映射**:字段名保持前后端一致时可自动映射[^3] 3. **参数校验**:结合`@Valid`注解进行参数验证 ```java public class UserDTO { @NotBlank private String username; @Size(min=6) private String password; } @PostMapping("/update") public String updateUser(@Valid @RequestBody UserDTO user) { // 处理逻辑 } ``` ### 三、常见错误处理 1. **400错误**:参数类型不匹配或必填参数缺失[^2] 2. **415错误**:未正确设置Content-Type头部(如JSON请求需要application/json) 3. **参数映射失败**:使用@JsonProperty处理字段名不一致问题 ```java public class UserInfo { @JsonProperty("first_name") private String firstName; } ``` ### 四、进阶参数处理 参考统一参数处理方案[^1],可以创建通用参数接收类: ```java public class PageParam<T> { private Integer page; private Integer size; private T params; } @PostMapping("/search") public PageResult search(@RequestBody PageParam<UserQuery> query) { // 自动提取分页参数查询条件 } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值