SpringBoot中表单提交报错“Content type ‘applicationx-www-form-urlencoded;charset=UTF-8‘ not supported“

46 篇文章 2 订阅

异常1

2021-06-24 12:32:20.137  WARN 20024 --- [io-8080-exec-10] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'application/x-www-form-urlencoded;charset=UTF-8' not supported]

错误代码1

login.html,采用了Thymeleaf

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>登录</title>
</head>
<body>
<form action="/login" th:action="@{/login}" method="post">
    用户名:<input type="text" name="username"><br/>
    密码:<input type="password" name="password"/><br/>
    <input type="submit" value="登录">
</form>
</body>
</html>

UserController.java

@Controller
public class UserController {
    @GetMapping("/")
    public String toLogin() {
        return "login";
    }

    @PostMapping("/login")
    @ResponseBody
    public String login(@RequestBody User user) {
        return user.toString();
    }
}

发现无法通过@RequestBody注解获取到表单POST提交的表单数据。

原因1

因为前端请求传Json对象的字符串则后端才使用@RequestBody。而我前端采用的表单提交的数据,是不能采用@RequestBody注解的。

解决1

第一种解决方式就是修改后端代码,去掉@RequestBody注解,也可以直接获取到表单提交的POST数据。

第二种解决方式就是修改前端代码,前端传递JSON对象的字符串,这里我采用jQuery来发送ajax请求传递JSON对象的字符串数据。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登录</title>
    <script src="/js/jquery-1.10.2.min.js"></script>
</head>
<body>
<form id="loginForm">
    用户名:<input type="text" name="username"><br/>
    密码:<input type="password" name="password"/><br/>
    <input type="button" value="登录" onclick="login()">
</form>
</body>
<script>
    function login() {
        $.ajax({
            url: "login",
            type: "POST",
            data: JSON.stringify({"username": "zhangsan", "password": "123456"}),
            contentType: "application/json",
            success: function (data) {
                alert("请求成功!")
            },
            error: function () {
                alert("请求失败!")
            }
        })
    }
</script>
</html>

异常2

error:Unsupported Media Type

错误代码

前端代码login.html,使用Ajax发送POST并传递JSON格式数据

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登录</title>
    <script src="/js/jquery-1.10.2.min.js"></script>
</head>
<body>
<form id="loginForm">
    用户名:<input type="text" name="username"><br/>
    密码:<input type="password" name="password"/><br/>
    <input type="button" value="登录" onclick="login()">
</form>
</body>
<script>
    function login() {
        $.ajax({
            url: "login",
            type: "POST",
            data: JSON.stringify({"username": "zhangsan", "password": "123456"}),
            success: function (data) {
                alert("请求成功!")
            },
            error: function () {
                alert("请求失败!")
            }
        })
    }
</script>
</html>

后端代码UserController.java,使用@RequestBody接收JSON格式的字符串数据

@Controller
public class UserController {
    @GetMapping("/")
    public String toLogin() {
        return "login";
    }

    @PostMapping("/login")
    @ResponseBody
    public String login(@RequestBody User user) {
        System.out.println(user);
        return user.toString();
    }
}

原因2

解决2

在Ajax提交数据的时候,设置数据类型contentType为"application/json"。

    function login() {
        var _this = this;
        $.ajax({
            url: "login",
            type: "POST",
            data: JSON.stringify({"username": "zhangsan", "password": "123456"}),
            contentType: "application/json",
            success: function (data) {
                alert("请求成功!")
            },
            error: function () {
                alert("请求失败!")
            }
        })
    }

再次查看请求头发现是"application/json"了

注意不要写成了dataType,我就踩过这个坑。

contentType是设置浏览器传递给服务器端的数据格式,告诉服务器,我要发什么类型的数据。

dataType是设置服务器传递给浏览器端的数据格式,告诉服务器,我要接收什么类型的数据。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当前课程商城项目的实战源码是我发布在 GitHub 上的开源项目 newbee-mall (新蜂商城),目前已有 9900 多个 Star,本课程是一个 Spring Boot 技术栈的实战类课程,课程共分为 3 大部分,前面两个部分为基础环境准备和相关概念介绍,第三个部分是 Spring Boot 商城项目功能的讲解,让大家实际操作并实践上手一个大型的线上商城项目,并学习到一定的开发经验以及其的开发技巧。商城项目所涉及的功能结构图整理如下: 作者寄语本课程录制于2019年,距今已有一段时间。期间,Spring Boot技术栈也有一些版本升级,比如Spring Boot 2.7.x发版、Spring Boot 3.x版本正式版本。对于这些情况,笔者会在本课程实战项目的开源仓库创建不同的代码分支,保持实战项目的源码更新,保证读者朋友们不会学习过气的知识点。新蜂商城的优化和迭代工作不会停止,不仅仅是功能的优化,在技术栈上也会不断的增加,截止2023年,新蜂商城已经发布了 7 个重要的版本,版本记录及开发计划如下图所示。 课程特色 对新手开发者十分友好,无需复杂的操作步骤,仅需 2 秒就可以启动这个完整的商城项目最终的实战项目是一个企业级别的 Spring Boot 大型项目,对于各个阶段的 Java 开发者都是极佳的选择实践项目页面美观且实用,交互效果完美教程详细开发教程详细完整、文档资源齐全代码+讲解+演示网站全方位保证,向 Hello World 教程说拜拜技术栈新颖且知识点丰富,学习后可以提升大家对于知识的理解和掌握,可以进一步提升你的市场竞争力 课程预览 以下为商城项目的页面和功能展示,分别为:商城首页 1商城首页 2购物车订单结算订单列表支付页面后台管理系统登录页商品管理商品编辑

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值