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 data
和request 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
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论