axios 发 post 请求,后端接收不到参数的解决方案

04-27 439阅读

  • 问题场景

  • 问题原因

    • 要点1
    • 要点2

    • 问题分析

    • 解决方案

      • 解决方案一
      • 解决方案二

      • 解决方案三

      • 解决方案四

      • 解决方案五

      • 解决方案六

        问题场景

        ==================================================================

        场景很简单,就是一个正常 axios post 请求:

        axios({

        headers: {

        ‘deviceCode’: ‘A95ZEF1-47B5-AC90BF3’

        },

        method: ‘post’,

        url: ‘/api/lockServer/search’,

        data: {

        username,

        pwd

        }

        })

        后台说没有接收到你的传参。

        这就有点奇怪了,我看了一下浏览器的请求信息是 OK 的,参数都是有的,而且之前这样用 axios 也没有这个问题。

        但是这个接口是通用的,别人都用了,是 OK 的,接口没问题。

        问题原因

        ==================================================================

        要点1


        原因就是这次的接口使用 java spring mvc

        并且在这个方法上使用了注解 @RequestParam

        那么这个是什么意思呢,这个是只能从请求的地址中取出参数,也就是只能从 username=admin&password=admin 这种字符串中解析出参数。

        要点2


        我们还可以看到我们这次请求的 Content-Type:

        application/json;charset=UTF-8

        关于这一点需要说明的是:

        1、axios会帮我们 转换请求数据和响应数据 以及 自动转换 JSON 数据

        axios 发 post 请求,后端接收不到参数的解决方案

        2、在 axios 源码中发现下面这段内容:(很关键)

        axios 发 post 请求,后端接收不到参数的解决方案

        我们知道在做 post 请求的时候,我们的传参是 data: {...} 或者直接 {...} 的形式传递的,嗯,就是下面这两种形式

        【第一种形式】

        axios 发 post 请求,后端接收不到参数的解决方案

        【第二种形式】

        axios 发 post 请求,后端接收不到参数的解决方案

        非常的刺激,这两种形式无一例外都触发了 axios 源码中【很关键】的那一段代码

        问题分析

        ==================================================================

        也就是说,我们的 Content-Type 变成了 application/json;charset=utf-8

        然后,因为我们的参数是 JSON 对象,axios 帮我们做了一个 stringify 的处理。

        而且查阅 axios 文档可以知道:axios 使用 post 发送数据时,默认是直接把 json 放到请求体中提交到后端的。

        那么,这就与我们服务端要求的 'Content-Type': 'application/x-www-form-urlencoded' 以及 @RequestParam 不符合。

        解决方案

        ==================================================================

        解决方案一


        【用 URLSearchParams 传递参数】

        let param = new URLSearchParams()

        param.append(‘username’, ‘admin’)

        param.append(‘pwd’, ‘admin’)

        axios({

        method: ‘post’,

        url: ‘/api/lockServer/search’,

        data: param

        })

        需要注意的是: URLSearchParams 不支持所有的浏览器,但是总体的支持情况还是 OK 的,所以优先推荐这种简单直接的解决方案

        解决方案二


        网上有很多方案说使用

        axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';

        或者

        {headers:{'Content-Type':'application/x-www-form-urlencoded'}}

        我试了一下,其实这样还是不行的

        【还需要额外的操作,(我们要将参数转换为query参数)】

        小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

        深知大多数初中级前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

        因此收集整理了一份《2024年Web前端开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

        axios 发 post 请求,后端接收不到参数的解决方案

        axios 发 post 请求,后端接收不到参数的解决方案

        axios 发 post 请求,后端接收不到参数的解决方案

        axios 发 post 请求,后端接收不到参数的解决方案

        由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

        如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注:前端)

        axios 发 post 请求,后端接收不到参数的解决方案

        自学几个月前端,为什么感觉什么都没学到??


        这种现象在很多的初学者和自学前端的同学中是比较的常见的。

        因为自学走的弯路是比较的多的,会踩很多的坑,学习的过程中是比较的迷茫的。

        最重要的是,在学习的过程中,不知道每个部分该学哪些知识点,学到什么程度才算好,学了能做什么。

        很多自学的朋友往往都是自己去找资料学习的,资料上有的或许就学到了,资料上没有的或许就没有学到。

        这就会给人一个错误的信息就是,我把资料上的学完了,估计也-就差不多的了。

        但是真的是这样的吗?非也,因为很多人找的资料就是很基础的。学完了也就是掌握一点基础的东西。分享给你一份前端分析路线,你可以参考。

        开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

        axios 发 post 请求,后端接收不到参数的解决方案

        还有很多的同学在学习的过程中一味的追求学的速度,很快速的刷视频,写了后面忘了前面,最后什么都没有学到,什么都知道,但是什么都不懂,要具体说,也说不出个所以然。

        份前端分析路线,你可以参考。

        开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

        axios 发 post 请求,后端接收不到参数的解决方案

        还有很多的同学在学习的过程中一味的追求学的速度,很快速的刷视频,写了后面忘了前面,最后什么都没有学到,什么都知道,但是什么都不懂,要具体说,也说不出个所以然。

        所以学习编程一定要注重实践操作,练习敲代码的时间一定要多余看视频的时间。

VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]