当前位置: 代码网 > it编程>编程语言>Java > SpringBoot和Vue接口如何调用传参

SpringBoot和Vue接口如何调用传参

2025年02月23日 Java 我要评论
springboot和vue接口调用传参简单总结一下常用的传参方式,一些前后端分离项目接口调试时经常出现传参格式错误问题。前后端进行交互时方法一般就分为get和post,至于后面的delete和put

springboot和vue接口调用传参

简单总结一下常用的传参方式,一些前后端分离项目接口调试时经常出现传参格式错误问题。

前后端进行交互时方法一般就分为get和post,至于后面的delete和put都是基于post进行封装而出的。

http请求中不同的请求方式会设置不同的content-type,参数的传递方式就会不一样,主要分为以下三种:

  • query string parameters
  • form data
  • request 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
  })
}

2.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,
}

3.@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

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com