有关Ajax、axios的put提交,使用data传输数据后端接收不到值

        因为采用了REST风格,所以一些地方不得不用PUT、DELET这两种提交方式,但是实际操作的时候可能会出现,后端的数据为null的情况。

一、我的解决方法是直接把变量放到url上,成为路径变量。如果你的变量比较多,建议前端先组合成json格式,然后后端接收的时候声明一个list变量接收。这个使用路径变量的方法我自己试过没有问题。

前端代码:

axios

axios.put("/users"+id).then(res=>{
            console.log(res)
            if (res.data.code === 1) {
                a();
            } else {
                alert(res.data.msg)
            }
        }).catch(()=>{
            alert("后端接口异常")
        })

 ajax

//let jsonStr = {"id": id};//数量多的时候可以这样
$.ajax({
            url: "/users/"+id,
            type: "PUT",
            // contentType: "application/json",//设置请求参数类型为json字符串
            // data: JSON.stringify(jsonStr),
            // dataType: "json",
            success(res) {
                // alert(data);
                // location.go(0);
                if (res.data.code === 1) {
                    a();
                } else {
                    alert(res.data.msg)
                }
            },
            error() {
                alert("后端接口异常");
            }
        });

后端代码:

/**
     * 修改员工账号状态
     * @param id 员工id
     * @return 自定义状态
     */
    @PutMapping("/{id}")
    public R<String> updateByStatus(@PathVariable String id){
//        System.out.println("user = " + user);
//        Integer id = user.getId();
        System.out.println("id = " + id);
        int i = 0;
        try {
            i = Integer.parseInt(id);
        } catch (NumberFormatException e) {
            e.printStackTrace();
            return R.err("id转化异常");
        }
        System.out.println(i);
        boolean b = serviceImp.updateByStatus(i);
        if (b){
            return R.success("修改成功");
        }
        return R.err("失败");
    }

二、在网上查找资料的时候看见了别人的一些方法,我自己全部测试了一遍,发现还是不能解决问题,不排除他们的问题跟我不一样所以我这里没起作用。

        第一种:采用POST  + _method:delete/put  + filter 的方法
ajax发送put 和 delete 请求时,需要传递参数,如果参数在url地址栏上,则可以正常使用,

        如果在 data:中需要传递参数,(浏览器会使用表单提交的方式进行提交) 则需要注意此时应作如下修改:

1).  请求方式设置为    type:"post",

2). 在data中加入 __method:"DELETE",或者 _method:"PUT" 参数 ,

        data:{_method:"DELETE", id:issueId,userId:userId},
3).后台的controller 仍为对应的DELETE 请求

        @RequestMapping(value="/answer/{answerId}",method=RequestMethod.DELETE)
public ResponseResult deleteAnswer(@PathVariable("answerId")int answerId,Issue issue){
//可自动封装成对象时,可直接采用对象参数
}
4).需要配置相应的filter(如果使用Spring Boot 则会自动配置)

<filter>
<filter-name>HiddenHttpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>HiddenHttpMethodFilter</filter-name>
<!-- 备注,这边的名称必须和配置'springmvc'的servlet名称一样 -->
<servlet-name>springmvc</servlet-name>
</filter-mapping>

        我的就是spring boot但是,测试了一遍还是无法解决


        第二种:仍然使用PUT DELETE 请求
        1).仍然使用put和delete请求,并且需要传递参数的时候data需要设置为json字符串
var jsonstr = {"id":issueId,"userId":userId};
var r=confirm("确认删除该回答?");
if(r){
$.ajax({
url:"http://localhost:8885/answer/"+answerId,
type:"DELETE",
contentType:"application/json",//设置请求参数类型为json字符串
data:JSON.stringify(jsonstr),//将json对象转换成json字符串发送
dataType:"json",
success:function(result){

},

});
}

客户端需要使用@RequestBody标注
@RequestMapping(value="/answer/{answerId}",method=RequestMethod.DELETE)
public ResponseResult deleteAnswer(@PathVariable("answerId")int answerId,@RequestBody Issue issue){

}

最后如果前端报错 提示 Request header field Content-Type is not allowed by Access-Control-Allow-Headers in preflight response , 可参考如下解决方案

https://stackoverflow.com/questions/12409600/error-request-header-field-content-type-is-not-allowed-by-access-control-allow

可以写一个过滤器

@WebFilter(servletNames={"dispatcherServlet"})//可配置对应的请求servlet 此处使用 springMVC
public class AjaxFilter implements Filter{
    
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        HttpServletResponse httpServletResponse=(HttpServletResponse) response;
        httpServletResponse.setHeader("Access-Control-Allow-Origin", "*");
        httpServletResponse.setHeader("Access-Control-Allow-Methods","GET,POST,DELETE,PUT");
        httpServletResponse.setHeader("Access-Control-Allow-Headers","Origin,X-Requested-With,Content-Type,Accept");              
        chain.doFilter(request, response);      
    }

}

        这种方法我也试了,还是没用

原文链接:https://www.bbsmax.com/A/amd0L4AWdg/

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


学习编程是顺着互联网的发展潮流,是一件好事。新手如何学习编程?其实不难,不过在学习编程之前你得先了解你的目的是什么?这个很重要,因为目的决定你的发展方向、决定你的发展速度。
IT行业是什么工作做什么?IT行业的工作有:产品策划类、页面设计类、前端与移动、开发与测试、营销推广类、数据运营类、运营维护类、游戏相关类等,根据不同的分类下面有细分了不同的岗位。
女生学Java好就业吗?女生适合学Java编程吗?目前有不少女生学习Java开发,但要结合自身的情况,先了解自己适不适合去学习Java,不要盲目的选择不适合自己的Java培训班进行学习。只要肯下功夫钻研,多看、多想、多练
Can’t connect to local MySQL server through socket \'/var/lib/mysql/mysql.sock问题 1.进入mysql路径
oracle基本命令 一、登录操作 1.管理员登录 # 管理员登录 sqlplus / as sysdba 2.普通用户登录
一、背景 因为项目中需要通北京网络,所以需要连vpn,但是服务器有时候会断掉,所以写个shell脚本每五分钟去判断是否连接,于是就有下面的shell脚本。
BETWEEN 操作符选取介于两个值之间的数据范围内的值。这些值可以是数值、文本或者日期。
假如你已经使用过苹果开发者中心上架app,你肯定知道在苹果开发者中心的web界面,无法直接提交ipa文件,而是需要使用第三方工具,将ipa文件上传到构建版本,开...
下面的 SQL 语句指定了两个别名,一个是 name 列的别名,一个是 country 列的别名。**提示:**如果列名称包含空格,要求使用双引号或方括号:
在使用H5混合开发的app打包后,需要将ipa文件上传到appstore进行发布,就需要去苹果开发者中心进行发布。​
+----+--------------+---------------------------+-------+---------+
数组的声明并不是声明一个个单独的变量,比如 number0、number1、...、number99,而是声明一个数组变量,比如 numbers,然后使用 nu...
第一步:到appuploader官网下载辅助工具和iCloud驱动,使用前面创建的AppID登录。
如需删除表中的列,请使用下面的语法(请注意,某些数据库系统不允许这种在数据库表中删除列的方式):
前不久在制作win11pe,制作了一版,1.26GB,太大了,不满意,想再裁剪下,发现这次dism mount正常,commit或discard巨慢,以前都很快...
赛门铁克各个版本概览:https://knowledge.broadcom.com/external/article?legacyId=tech163829
实测Python 3.6.6用pip 21.3.1,再高就报错了,Python 3.10.7用pip 22.3.1是可以的
Broadcom Corporation (博通公司,股票代号AVGO)是全球领先的有线和无线通信半导体公司。其产品实现向家庭、 办公室和移动环境以及在这些环境...
发现个问题,server2016上安装了c4d这些版本,低版本的正常显示窗格,但红色圈出的高版本c4d打开后不显示窗格,
TAT:https://cloud.tencent.com/document/product/1340