SpringBoot和Vue接口如何調(diào)用傳參
SpringBoot和Vue接口調(diào)用傳參
簡(jiǎn)單總結(jié)一下常用的傳參方式,一些前后端分離項(xiàng)目接口調(diào)試時(shí)經(jīng)常出現(xiàn)傳參格式錯(cuò)誤問(wèn)題。
前后端進(jìn)行交互時(shí)方法一般就分為get和post,至于后面的delete和put都是基于post進(jìn)行封裝而出的。
Http請(qǐng)求中不同的請(qǐng)求方式會(huì)設(shè)置不同的Content-Type,參數(shù)的傳遞方式就會(huì)不一樣,主要分為以下三種:
Query String ParametersForm DataRequest Payload
下面使用的axios請(qǐng)求都是經(jīng)過(guò)封裝的,文章最后有對(duì)應(yīng)的封裝方法
GET請(qǐng)求
我們發(fā)送get請(qǐng)求時(shí),參數(shù)是通過(guò)url的形式進(jìn)行傳遞,即url中?后面拼接的參數(shù),以&做連接,參數(shù)直接表現(xiàn)在url中。
例如:
http://localhost:8801/api/selectDetail?id=1&userName="zhang"
前端通過(guò)query String parameters 方式傳參,axios中指明使用params
export function selectList(params) {
return request({
url: 'api/xxx/selectList',
method: 'get',
params
})
}POST請(qǐng)求
Post請(qǐng)求有兩種傳遞參數(shù)的形式:form data和request payload的形式
發(fā)起post請(qǐng)求時(shí)若未指定content-type,則默認(rèn)content-type為application/x-www-form-urlencoded,參數(shù)是在請(qǐng)求體中,參數(shù)以form data的形式傳遞,不會(huì)出現(xiàn)在請(qǐng)求的url中。
若content-type為application/json,則參數(shù)會(huì)以request payload的形式進(jìn)行傳遞,數(shù)據(jù)格式為json形式,請(qǐng)求表單的參數(shù)在request payload中,不會(huì)出現(xiàn)在請(qǐng)求的url中,使用原生的Ajax post請(qǐng)求不指定請(qǐng)求頭默認(rèn)的參數(shù)就是出現(xiàn)在request payload中。
前端通過(guò)formData方式傳參,axios中指明使用data
export function selectList(data) {
return request({
url: 'api/xxx/selectList',
method: 'post',
data
})
}前端通過(guò)request payload方式傳參
export function selectList(data) {
return request({
url: 'api/xxx/selectList',
method: 'post',
data
})
}SpringBoot注解對(duì)應(yīng)傳參方式
@RequestParam() 默認(rèn)接收application/x-www-form-urlencoded編碼格式的參數(shù)
@RequestBody() 默認(rèn)接收json格式的參數(shù)
1.spring通過(guò) @requestParam (queryParam)(路徑傳參-默認(rèn)傳參注解)接收的參數(shù)都是url拼接 將參數(shù)放到query String parameters,前端可以通過(guò)下面三種方式傳參
- params 傳參 (推薦) – params
- formData傳參 – data (需要修改Content-Type)
- Qs傳參 – data ,需要手動(dòng)處理header “Content-Type”: “application/x-www-form-urlencoded”
spring boot接口
@GetMapping(value = "/hello")
public ResponseEntity getUser(@RequestParam String username){
}
//http://lcoalhost:8080/hello?username=1111axios調(diào)用
#params 傳參
export function find(params){
return request({
url: `${API}/info/find`,
method: 'get',
params:params
})
}2.spring通過(guò)@requestBody,通過(guò)post提交消息主體中參數(shù),參數(shù)值為json格式,默認(rèn)就是json格式不需要進(jìn)行處理
- 通過(guò)data傳參
springboot 接口
@PostMapping
public ResponseEntity<Record> add(@RequestBody Record record) {
return ResponseEntity.ok(this.recordService.insert(record));
}axios調(diào)用方法(這里的axios是經(jīng)過(guò)封裝后的)
export function add(data){
return request({
url: `${API}/record/add`,
method: 'post',
data
})
}請(qǐng)求信息:
POST http://localhost:5138/record/
Content-Type: application/json
--- 參數(shù)內(nèi)容
{
"objective": 1.0,
"objRate": 1.0,
"objDate": "2022/1/8 12:05:00",
"outputPrice": 1.0,
}3.@pathVariable(@pathParam)url路徑中參數(shù)
- 拼接url
springboot接口
@DeleteMapping(value = "/job/{id}")
public ResponseEntity delete(@PathVariable(value = "id", required = false, defaultValue = "0") Long id){
}
//http://localhost:8080/job/1axios調(diào)用
export function queryById(id){
return request({
url: `${API}/info/queryById/${id}`,
method: 'get'
})
}axios對(duì)應(yīng)的封裝方法
// 封裝axios:使用請(qǐng)求與響應(yīng)攔截器
import axios from 'axios'
import { ElMessage, ElMessageBox } from 'element-plus'
// 引入qs
import qs from 'qs'
import useUserStore from '@/store/modules/user'
// 利用axios對(duì)象的create方法,創(chuàng)建axios實(shí)例(其他的配置:基礎(chǔ)路徑、超時(shí)時(shí)間)
const service = axios.create({
//基礎(chǔ)路徑
baseURL: '/',
timeout: 5000, // 超時(shí)時(shí)間的設(shè)置
})
// 第二步:request實(shí)例添加請(qǐng)求與響應(yīng)攔截器
service.interceptors.request.use((config) => {
// 獲取用戶(hù)倉(cāng)庫(kù)內(nèi)的token,登錄成功后攜帶公共參數(shù)
let userStore = useUserStore()
if(userStore.token) {
config.headers['Authorization'] = userStore.token
}
return config
})
// 第三步:配置相應(yīng)攔截器
service.interceptors.response.use(
(response) => {
// 獲取返回成功數(shù)據(jù)的狀態(tài)碼code和錯(cuò)誤信息message
const { code, message } = response.data;
if(code) {
// 有狀態(tài)碼判斷是否為200,除此皆為異常響應(yīng)
if(code == 200) {
return response.data
}
else if (code < 200 || code > 300) {
ElMessage({
message: message || '系統(tǒng)出錯(cuò)',
type: 'error'
});
return Promise.reject('error')
}
else {
// 其他類(lèi)型的狀態(tài)碼
ElMessage.error(message)
return Promise.reject(response.data)
}
} else {
// 未返回狀態(tài)碼直接返回響應(yīng)信息
ElMessage.error('系統(tǒng)服務(wù)連接失敗')
return Promise.reject(response)
}
},
(error) => {
// 失敗的回調(diào):處理http網(wǎng)絡(luò)錯(cuò)誤
//定義一個(gè)變量:存儲(chǔ)網(wǎng)絡(luò)錯(cuò)誤信息
let message = ''
if(error.code === 'ECONNABORTED') {
message = '連接超時(shí)中止,請(qǐng)稍后重試!'
} else {
// http狀態(tài)碼
const status = error.response.status
switch (status) {
case 401:
message = '無(wú)權(quán)訪問(wèn)'
break
case 404:
message = '請(qǐng)求地址錯(cuò)誤'
break
default:
message = '網(wǎng)絡(luò)出現(xiàn)問(wèn)題'
break
}
}
// 提示錯(cuò)誤信息
ElMessage({
type: 'error',
message,
})
return Promise.reject(error)
},
)
// 利用axios對(duì)象的create方法,創(chuàng)建axios實(shí)例(其他的配置:基礎(chǔ)路徑、超時(shí)時(shí)間)
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);
});
});
}
// 對(duì)外暴露
export default request總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java8?stream流的map()方法你會(huì)使用了嗎
在日常的開(kāi)發(fā)工作中經(jīng)常碰到要處理list中數(shù)據(jù)的問(wèn)題。本文主要帶大家了解下Java8?stream流中map()方法的使用,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2022-12-12
Spring的異常處理@ExceptionHandler注解解析
這篇文章主要介紹了Spring的異常處理@ExceptionHandler注解解析,當(dāng)一個(gè)Controller中有方法加了@ExceptionHandler之后,這個(gè)Controller其他方法中沒(méi)有捕獲的異常就會(huì)以參數(shù)的形式傳入加了@ExceptionHandler注解的那個(gè)方法中,需要的朋友可以參考下2023-12-12
SpringBoot集成JmsTemplate(隊(duì)列模式和主題模式)及xml和JavaConfig配置詳解
這篇文章主要介紹了SpringBoot集成JmsTemplate(隊(duì)列模式和主題模式)及xml和JavaConfig配置詳解,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08
關(guān)于SpringSecurity配置403權(quán)限訪問(wèn)頁(yè)面的完整代碼
本文給大家分享SpringSecurity配置403權(quán)限訪問(wèn)頁(yè)面的完整代碼,配置之前和配置之后的詳細(xì)介紹,代碼簡(jiǎn)單易懂,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2021-06-06
淺析Java 數(shù)據(jù)結(jié)構(gòu)常用接口與類(lèi)
本篇文章主要介紹了Java中的數(shù)據(jù)結(jié)構(gòu),Java工具包提供了強(qiáng)大的數(shù)據(jù)結(jié)構(gòu)。需要的朋友可以參考下2017-04-04
Java實(shí)現(xiàn)FutureTask的示例詳解
在并發(fā)編程當(dāng)中我們最常見(jiàn)的需求就是啟動(dòng)一個(gè)線程執(zhí)行一個(gè)函數(shù)去完成我們的需求,而在這種需求當(dāng)中,我們需要函數(shù)有返回值。Java給我們提供了這種機(jī)制,去實(shí)現(xiàn)這一個(gè)效果:FutureTask。本文為大家準(zhǔn)備了Java實(shí)現(xiàn)FutureTask的示例代碼,需要的可以參考一下2022-08-08
java通過(guò)AES生成公鑰加密數(shù)據(jù)ECC加密公鑰
這篇文章主要為大家介紹了java通過(guò)AES生成公鑰加密數(shù)據(jù)ECC加密公鑰實(shí)現(xiàn)案例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12

