axios利用params/data发送参数给springboot controlle的正确获取方式

目录
  • 引言
  • 问题分析:
  • 解决上述解决方案:
  • 前端传递json对象到springboot web 程序
  • 总结

引言

今天有人遇到接口调用不通的情况,粗略看了一下是axios跨域请求引起了。找到问题,处理就简单多了。

但是我看其代码,发现比较有意思

export function agentlist(query) {
  return request({
    url: /agent/list',
    method: 'get',
    params: query
  })
}
export function editagent(data) {
    return request({
        url: '/agent/editagent',
        method: 'post',
        data:data
    })
}
export function deleteagent(id) {
    return request({
        url: '/agent/delete',
        method: 'post',
        params:{id}
    })
}

上面的代码中的request是axios实例,同是post却出现了data或params做数载体的情况。凭直觉该代码会在后续请求中出现问题,果不其然后续出现各种问题。

出现的问题主要是:前端传递参数给了springboot程序,但是程序中却接收不到数据或只接收到部分数据。出现问题前后端代码如下:

前端:

export function login(account, password, orgType) {
  return request({
    url: '/webapi/login',
    method: 'post',
    data: {"loginId":account,"password":password,"orgType":orgType}
)}

后端:

@PostMapping(value = "/login")
public Result login(String loginId, String password, int orgType, HttpServletResponse response){
}

程序运行异常:

java.lang.IllegalStateException: Optional int parameter 'orgType' is present but cannot be translated into a null value due to being declared as a primitive type. Consider declaring it as object wrapper for the corresponding primitive type.

问题分析:

出现异常的原因看似orgType无法转换为对象类型引发的,真实情况并非如此。真正的原因是Java中的代码根本就无法获取到3个参数,前两个是String类型在无法获取参数的情况下会被赋值为null,第三个参数因是 int 类型,因无法赋值为null,故引发该异常。出现异常并非Java代码写得不好,而是前后台传参衔接出了问题。

前端数据发送网络请求,注意下面的数据的格式:

前端数据确实发送了,但是数据的格式为json格式。

服务器端POST请求获取参数,要求的参数格式为:key=value&key2=value2&key.....,因此服务器端无法获取数据也就好理解了。

解决上述解决方案:

前端解决方案1

export function login(account, password, orgType) {return request({
    url: '/webapi/login',
    method: 'post',
    data: "loginId="+account+ "&password="+password+"&orgType="+orgType
  })
}

手动构造服务器端需要的数据格式,此时再次执行客户端程序,并跟踪网络请求如下图,springboot程序正常获取到数据。

上面这种方案虽能解决问题,但太机械,用来分析问题可以,生产中就行不通了。

前端方案2

export function login(account, password, orgType) {
  return request({
    url: '/webapi/login',
    method: 'post',
    params: {"loginId":account, "password":password,"orgType":orgType}
  })
}

将 axios 中的参数载体由 data 改为 params,此时再次执行客户端程序,并跟踪网络请求如下图,springboot程序正常获取到数据。

上面这种解决方案,将要发送的数据对象以params做载体发送时,axios会把数据对象的属性与值拼成 k=v&k=v 格式,但这些数据是作为 Query String(放在url中的参数) 传递给后台程序的,因此并非真正意义上post传参(实际是post方式向增加了参数url地址,提交空数据

(0)

相关推荐

  • 基于springboot与axios的整合问题

    目录 springboot与axios的整合 1.get请求 2.post请求 springboot与axios遇到的坑 spring boot axios springboot与axios的整合 使用axios的时候一定要引用它的js包(可用npm命令:npm install axios) 1.get请求 // 为给定 ID 的 user 创建请求 axios.get('/demo/name') .then(function (response) { console.log(response.

  • SpringBoot+Vue+Axios+BootStrap实现图书的增删改查功能示例

    目录 一.开发工具 二.项目结构 三.编写项目 四.运行项目 由于是初学Vue.Axios,可能在界面和功能上存在着一些问题,但这些并不妨碍使用.如果有对编程感兴趣的朋友,可以试着做一做.这个由于是第一次做,不太熟练.在后续的过程中会不断的完善. 一.开发工具 IntelliJ IDEA Ultimate 2021.1 apache-maven-3.5.4 MySQL5.7 JDK 1.8.0_281 二.项目结构 三.编写项目 1.创建数据库 SET NAMES utf8mb4; SET FO

  • Java axios与spring前后端分离传参规范总结

    目录 前言 一.@RequestParam注解对应的axios传参方法 1.1.params传参(推荐) 1.2.FormData传参 1.3.qs.stringfy传参 二.@RequestBody的axios传参方法 前言 前后端分离开发的场景下,开发人员的工作内容更加专注与专业,但是也产生了一些额外的沟通成本.比如:本文中为大家说明的前后端参数传递与接受方法.本文主要是面对前端使用axios,后端使用Spring进行参数接受的情况进行说明.在使用spring的时候,与前端配合开发,容易出现

  • axios发送post请求springMVC接收不到参数的解决方法

    axios发送post请求时,出现了参数后台接收不到的情况,分析了下请求,发现是请求头content-type不对,是application/json,正常应该是application/x-www-form-urlencoded. 解决方法有以下三种: 1.设置axios的默认请求头 //设置全局的 axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded'; var instance = a

  • Axios get post请求传递参数的实现代码

    目录 Axios概述 一. 安装 三. axiosAPI 四.请求配置 五.响应内容 六.默认配置 七.拦截器 八.错误处理 九.取消 Axios概述 首先,axios是基于promise用于浏览器和node.js的http客户端 特点 : 支持浏览器和node.js 支持promise 能拦截请求和响应 能转换请求和响应数据 能取消请求 自动转换json数据 浏览器端支持防止CSRF(跨站请求伪造) 一. 安装 npm安装 $ npm install axiosbower安装 $ bower

  • 基于vue 添加axios组件,解决post传参数为null的问题

    好,下面上货. 1.安装axios npm install axios --save 2.添加axios组件 import axios from 'axios' axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded'; axios.defaults.baseURL = 'http://localhost:7878/zkview'; Vue.prototype.$ajax = axios;

  • python定时利用QQ邮件发送天气预报的实例

    大致介绍 好久没有写博客了,正好今天有时间把前几天写的利用python定时发送QQ邮件记录一下 1.首先利用request库去请求数据,天气预报使用的是和风天气的API(www.heweather.com/douments/api/s6/weather-forecast) 2.利用python的jinja2模块写一个html模板,用于展示数据 3.python的email构建邮件,smtplib发送邮件 4.最后使用crontab定时执行python脚本 涉及的具体知识可以去看文档,本文主要就是

  • 利用Spring Data MongoDB持久化文档数据的方法教程

    前言 本文主要给大家介绍了关于利用Spring Data MongoDB持久化文档数据的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 介绍 NoSQL:not only SQL,非关系型数据 MongoDB是文档型数据,文档是独立的实体,文档数据库不适用于关联关系明显的数据 Spring Data MongoDB 1.Spring Data MongoDB提供了三种方式在Spring应用中使用MongoDB 通过注解实现对象-文档映射 使用MongoTemplate

  • java利用udp实现发送数据

    本文实例为大家分享了java利用udp实现发送数据的具体代码,供大家参考,具体内容如下 1.udp的特点 数据以包的形式发送数据 udp是面向无连接的 udp会丢失数据,是一种不安全的连接 udp的传输速度较快 2.发送端 package cn.uu710.SocketTest; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.

  • SpringBoot之自定义Filter获取请求参数与响应结果案例详解

    一个系统上线,肯定会或多或少的存在异常情况.为了更快更好的排雷,记录请求参数和响应结果是非常必要的.所以,Nginx 和 Tomcat 之类的 web 服务器,都提供了访问日志,可以帮助我们记录一些请求信息. 本文是在我们的应用中,定义一个Filter来实现记录请求参数和响应结果的功能. 有一定经验的都知道,如果我们在Filter中读取了HttpServletRequest或者HttpServletResponse的流,就没有办法再次读取了,这样就会造成请求异常.所以,我们需要借助 Spring

  • 老兵新传-各种漏洞的利用和一些搜索参数

    各种漏洞的利用和一些搜索参数 说到漏洞,首先应该提到的就是动网的上传漏洞了. "洞网"漏洞拉开了上传漏洞文件的序幕,其他系统的上 传漏洞接踵而来! asp动网论坛漏洞分析 1.这个漏洞不算太严重,用过动网论坛的人都知道,发帖时直接写javascript会被过滤拆分,写http会自动加上链接,漏洞就在此,在这两个地方变通一下,把两个单词的某个字母换成编码形式,然后系统再对应地解码回字母,就达到了避免被过滤的目的.例子说明一下,在发帖时写入[img]javasc然后在"特征字符&

  • SpringBoot拦截器如何获取http请求参数

    1.1.获取http请求参数是一种刚需 我想有的小伙伴肯定有过获取http请求的需要,比如想 前置获取参数,统计请求数据 做服务的接口签名校验 敏感接口监控日志 敏感接口防重复提交 等等各式各样的场景,这时你就需要获取 HTTP 请求的参数或者请求body,一般思路有两种,一种就是自定义个AOP去拦截目标方法,第二种就是使用拦截器.整体比较来说,使用拦截器更灵活些,因为每个接口的请求参数定义不同,使用AOP很难细粒度的获取到变量参数,本文主线是采用拦截器来获取HTTP请求. 1.2.定义拦截器获

  • 利用5分钟快速搭建一个springboot项目的全过程

    目录 前言 一.空项目 二.开始springboot之旅 三.总结 前言 现在开发中90%的人都在使用springboot进行开发,你有没有这样的苦恼,如果让你新建一个springboot开发环境的项目,总是很苦恼,需要花费很长时间去调试.今天来分享下如何快速搭建. 一.空项目 现在开发过程中大都是idea这个集成开发环境,笔者之前也是很执拗,一直使用的是eclipse,后来也是公司需要转到了idea,不得不说idea确实好用,没用过的小伙伴可以尝试.这里以idea为演示环境. 我一般都是从一个

  • Springboot导出文件,前端下载文件方式

    Springboot导出文件,前端下载文件 后端代码 可以把请求设置为post,我这里是Get @RequestMapping(value = "/download", method = RequestMethod.POST) public void download(HttpServletRequest request, HttpServletResponse res) throws Exception { File excelFile = new File("/Users

随机推荐