SpringBoot和Vue接口调用传参方式

简单总结一下常用的传参方式,一些前后端分离项目接口调试时经常出现传参格式错误问题。
前后端进行交互时方法一般就分为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和错误信息messageconst { 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.statusswitch (status) {case 401:message = '无权访问'breakcase 404:message = '请求地址错误'breakdefault:message = '网络出现问题'break}}// 提示错误信息ElMessage({type: 'error',message,})return Promise.reject(error)},
)// 利用axios对象的create方法,创建axios实例(其他的配置:基础路径、超时时间)
interface ReqParamsType {url:stringdata?: anyparams?:anymethod?:string,type?:stringtimestamp?:booleantimeout?: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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/647558.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C#,获取与设置Windows背景图片的源代码

为了满足孩子们个性化桌面的需求。 这里发布获取与设置Windows背景图片的源代码。 1 文本格式 using System; using System.IO; using System.Data; using System.Linq; using System.Text; using System.Drawing; using System.Collections; using System.Collections.Gene…

ES数据处理方法

由于日志数据存在ES项目里&#xff0c;需要从ES中获取日志进行分析&#xff0c;使用SQL数据进行处理&#xff0c;如下&#xff1a; select traceid-- STRING COMMENT 流程id, ,appnum -- BIGINT COMMENT 迭代号, ,appversion --STRING COMMENT APP版本, ,appc…

JeecgBoot集成TiDB,打造高效可靠的数据存储解决方案

TiDB简介 TiDB是PingCAP公司自主设计、研发的开源分布式关系型数据库&#xff0c;同时支持在线事务处理与在线分析处理 (Hybrid Transactional and Analytical Processing, HTAP) 的融合型分布式数据库产品&#xff0c;具备水平扩容或者缩容、金融级高可用、实时 HTAP、云原生…

【学习笔记】CF1349F2 Slime and Sequences (Hard Version)

多项式工业警告&#xff01;&#xff01;&#xff01; 点击看题意 思路来自 这位大佬 。 为什么这么好的题解没人评论。 Part 1 前置知识&#xff1a;拉格朗日反演&#xff08;多项式复合&#xff09;&#xff0c;分式域&#xff08;引入负整数次项&#xff09;。 条件&a…

基数排序算法

1. 排序算法分类 十种常见排序算法可以分为两大类&#xff1a; 比较类排序&#xff1a; 通过比较来决定元素间的相对次序&#xff0c;由于其时间复杂度不能突破O(nlogn)&#xff0c;因此也称为非线性时间比较类排序。比较类排序算法包括&#xff1a;插入排序、希尔排序、选择…

Netty接收超长TCP数据时 使用按行分隔Decoder无法正确解码的问题解决

使用Netty实现的tcp服务端&#xff0c;由于tcp是流式传输的&#xff0c;故需要选用一个解码器对流式消息进行解码和包分隔&#xff0c;以防收到不正确的包。例如LineBasedFrameDecoder&#xff0c;LengthFieldBasedFrameDecoder&#xff0c;DelimiterBasedFrameDecoder等常用解…

第139期 做大还是做小-Oracle名称哪些事(20240125)

数据库管理139期 2024-01-25 第139期 做大还是做小-Oracle名称哪些事&#xff08;20240125&#xff09;1 问题2 排查3 扩展总结 第139期 做大还是做小-Oracle名称哪些事&#xff08;20240125&#xff09; 作者&#xff1a;胖头鱼的鱼缸&#xff08;尹海文&#xff09; Oracle A…

SQL - 事务控制

SQL - 事务控制 文章目录 SQL - 事务控制TCL - 事务事务的边界事务的特性事务的应用 事务隔离等级MySQL支持四种隔离级别 TCL - 事务 **模拟场景&#xff1a;**生活当中转账是转账方账户扣钱&#xff0c;收账方账户加钱。用数据库操作来模拟现实转账。 数据库模拟&#xff1a…

CI/CD

介绍一下CI/CD CI/CD的出现改变了开发人员和测试人员发布软件的方式,从最初的瀑布模型,到最后的敏捷开发(Agile Development),再到今天的DevOps,这是现代开发人员构建出色产品的技术路线 随着DevOps的兴起,出现了持续集成,持续交付和持续部署的新方法,传统的软件开发和交付方…

软件设计师——软件工程(五)

&#x1f4d1;前言 本文主要是【软件工程】——软件设计师——软件工程的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是听风与他&#x1f947; ☁️博客首页&#xff1a;CSDN主页听风与他 &#x1f304…

安全防御综合组网实验

题目 要求 生产区在工作时间可以访问服务器区&#xff0c;仅可以访问http服务器。办公区全天可以访问服务器区&#xff0c;其中10.0.2.20 可以访问FTP服务器和http服务器。10.0.2.10仅可以ping通10.0.3.10。办公区在访问服务器区时采用匿名认证的方式进行上网行为管理。办公区…

Vue内嵌套层级过深,el-input改变值视图无响应

出现场景 1.v-for内绑定复杂类型数据内部值&#xff0c;通过input更改其值时。 2.element表单或表格等组件内部&#xff0c;el-input绑定复杂类型数据内部值&#xff0c;通过input更改其值时。 解决思路 1.el-input加入 input“change($event)” … import { getCurrentInst…

【RabbitMQ】死信(延迟队列)的使用

目录 一、介绍 1、什么是死信队列(延迟队列) 2、应用场景 3、死信队列(延迟队列)的使用 4、死信消息来源 二、案例实践 1、案例一 2、案例二&#xff08;消息接收确认 &#xff09; 3、总结 一、介绍 1、什么是死信队列(延迟队列) 死信&#xff0c;在官网中对应的单词…

Unity学习之坦克游戏制作(2)游戏场景的制作

文章目录 1. 基础场景的搭建2. 游戏主面板2.1 拼出面板2.2 创建新面板2.3 设置面板复用2.4 退出界面 3. 坦克基类3.1 创建基类脚本3.1.1 基类基本属性3.1.2 抽象开火函数3.1.3 受伤虚函数3.1.4 死亡虚函数 4 玩家——基础移动旋转摄像机跟随4.1 玩家对象脚本4.2 控制坦克移动4.…

移动端打包成功后禁止生成 report.html 文件,并不自动打开该文件

目录 【问题】移动端 npm run build 打包后生成并打开 report.html 文件package.json 文件vue.config.js 代码 【解决】打包后去除 report.html 文件vue.config.js 代码 参考 【问题】移动端 npm run build 打包后生成并打开 report.html 文件 package.json 文件 {"name&…

蓝牙----蓝牙协议栈L2CAP

蓝牙协议栈----L2CAP L2CAP的功能术语介绍L2CAP信道L2CAP的工作模式经典蓝牙的分段和分解过程 L2CAP—逻辑链路控制和适配层协议 L2CAP的功能 经典蓝牙的L2CAP层实现了协议复用、数据分段与重组、封装调度等操作。BLE的L2CAP层是经典蓝牙L2CAP层的简化版本&#xff1a; 在基…

鸿蒙自定义组件内自定义构建函数

参数传递规则 自定义构建函数的参数传递有按值传递和按引用传递两种&#xff0c;均需遵守以下规则&#xff1a; 参数的类型必须与参数声明的类型一致&#xff0c;不允许undefined、null和返回undefined、null的表达式。在自定义构建函数内部&#xff0c;不允许改变参数值。如…

8-Docker网络命令之connect

1.connect介绍 Docker网络命令connect是用来将容器连接到网络。 2.connect用法 docker network connect [参数] NETWORK CONTAINER [root@centos79 ~]# docker network connect --helpUsage: docker network connect [OPTIONS] NETWORK CONTAINERConnect a container to a…

爬虫js逆向分析——x平台(实现)

爬虫js逆向分析——x平台&#xff08;实现&#xff09; &#xff08;仅供学习&#xff0c;本案例只是分析流程没有账号&#xff09;网址&#xff1a;https://xuexi.chinabett.com/ 1.分析请求包格式 打开控制台&#xff0c;并勾选保存日志&#xff0c;然后点击登录看发送了什…

ICSpector:一款功能强大的微软开源工业PLC安全取证框架

关于ICSpector ICSpector是一款功能强大的开源工业PLC安全取证框架&#xff0c;该工具由微软的研究人员负责开发和维护&#xff0c;可以帮助广大研究人员轻松分析工业PLC元数据和项目文件。 ICSpector提供了方便的方式来扫描PLC并识别ICS环境中的可疑痕迹&#xff0c;可以用于…