SpringBoot和Vue接口如何調(diào)用傳參
SpringBoot和Vue接口調(diào)用傳參
簡(jiǎn)單總結(jié)一下常用的傳參方式,一些前后端分離項(xiàng)目接口調(diào)試時(shí)經(jīng)常出現(xiàn)傳參格式錯(cuò)誤問題。
前后端進(jìn)行交互時(shí)方法一般就分為get和post,至于后面的delete和put都是基于post進(jìn)行封裝而出的。
Http請(qǐng)求中不同的請(qǐng)求方式會(huì)設(shè)置不同的Content-Type,參數(shù)的傳遞方式就會(huì)不一樣,主要分為以下三種:
Query String Parameters
Form Data
Request Payload
下面使用的axios請(qǐng)求都是經(jīng)過封裝的,文章最后有對(duì)應(yīng)的封裝方法
GET請(qǐng)求
我們發(fā)送get請(qǐng)求時(shí),參數(shù)是通過url的形式進(jìn)行傳遞,即url中?后面拼接的參數(shù),以&做連接,參數(shù)直接表現(xiàn)在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請(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中。
前端通過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注解對(duì)應(yīng)傳參方式
@RequestParam()
默認(rèn)接收application/x-www-form-urlencoded
編碼格式的參數(shù)
@RequestBody()
默認(rèn)接收json
格式的參數(shù)
1.spring通過 @requestParam (queryParam)
(路徑傳參-默認(rèn)傳參注解)接收的參數(shù)都是url拼接 將參數(shù)放到query String parameters,前端可以通過下面三種方式傳參
- 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=1111
axios調(diào)用
#params 傳參 export function find(params){ return request({ url: `${API}/info/find`, method: 'get', params:params }) }
2.spring通過@requestBody
,通過post提交消息主體中參數(shù),參數(shù)值為json格式,默認(rèn)就是json格式不需要進(jìn)行處理
- 通過data傳參
springboot 接口
@PostMapping public ResponseEntity<Record> add(@RequestBody Record record) { return ResponseEntity.ok(this.recordService.insert(record)); }
axios調(diào)用方法(這里的axios是經(jīng)過封裝后的)
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/1
axios調(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) => { // 獲取用戶倉庫內(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 { // 其他類型的狀態(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 = '無權(quán)訪問' break case 404: message = '請(qǐng)求地址錯(cuò)誤' break default: message = '網(wǎng)絡(luò)出現(xià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ì)使用了嗎
在日常的開發(fā)工作中經(jīng)常碰到要處理list中數(shù)據(jù)的問題。本文主要帶大家了解下Java8?stream流中map()方法的使用,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2022-12-12Spring的異常處理@ExceptionHandler注解解析
這篇文章主要介紹了Spring的異常處理@ExceptionHandler注解解析,當(dāng)一個(gè)Controller中有方法加了@ExceptionHandler之后,這個(gè)Controller其他方法中沒有捕獲的異常就會(huì)以參數(shù)的形式傳入加了@ExceptionHandler注解的那個(gè)方法中,需要的朋友可以參考下2023-12-12SpringBoot集成JmsTemplate(隊(duì)列模式和主題模式)及xml和JavaConfig配置詳解
這篇文章主要介紹了SpringBoot集成JmsTemplate(隊(duì)列模式和主題模式)及xml和JavaConfig配置詳解,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08關(guān)于SpringSecurity配置403權(quán)限訪問頁面的完整代碼
本文給大家分享SpringSecurity配置403權(quán)限訪問頁面的完整代碼,配置之前和配置之后的詳細(xì)介紹,代碼簡(jiǎn)單易懂,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2021-06-06淺析Java 數(shù)據(jù)結(jié)構(gòu)常用接口與類
本篇文章主要介紹了Java中的數(shù)據(jù)結(jié)構(gòu),Java工具包提供了強(qiáng)大的數(shù)據(jù)結(jié)構(gòu)。需要的朋友可以參考下2017-04-04Java實(shí)現(xiàn)FutureTask的示例詳解
在并發(fā)編程當(dāng)中我們最常見的需求就是啟動(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-08java通過AES生成公鑰加密數(shù)據(jù)ECC加密公鑰
這篇文章主要為大家介紹了java通過AES生成公鑰加密數(shù)據(jù)ECC加密公鑰實(shí)現(xiàn)案例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12