V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Sponsored by
LinkedIn
2000 个不用坐班的远程好工作在召唤你 · 弹性上班不打卡,工作和生活都能拥有
2000 个不用坐班的全球远程工作,帮助 V2EX 的小伙伴开启全新的工作方式。
Promoted by LinkedIn
karlguo7
V2EX  ›  程序员

关于 springboot 的 ajax post 请求的问题

  •  
  •   karlguo7 · 2021-05-25 18:04:03 +08:00 · 1068 次点击
    这是一个创建于 487 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我使用 m1 Macbook 想做个 demo 玩玩,但是请求后端就开始报错了,请大佬帮忙看看。 使用 Springboot 2.2.6.RELEASE+thymeleaf+mybatis-plus+mysql

    前端 js:

        function login() {
            $("#loginForm").validate({
                submitHandler: function (form) {
                    doLogin();
                }
            });
        }
    
        function doLogin() {
            g_showLoading();//显示 loading 动画
    
            var mobile = $("#mobile").val();
            var inputPassword = $("#password").val();
            alert("mobile:" + mobile + ",password:" + inputPassword);
            var salt = g_password_salt;
            var str = "" + salt.charAt(0) + salt.charAt(2) + inputPassword + salt.charAt(5) + salt.charAt(4);
            var password = md5(str);//md5 加密
            console.log(password);//这里打印不出密码
    
            var data = {}
            data.mobile = mobile;
            data.password = password;
    
            $.ajax({
                url: '/login/doLogin',
                type: 'POST',
                dataType: "json",
                cache: false,
                //async: true,
                data: JSON.parse(data),
                success: function (data) {
                    layer.closeAll();
                    if (data.code === 200) {
                        layer.msg("登录成功");
                    } else {
                        layer.msg(data.message);
                    }
                    //return false;
                },
                error: function () {
                    layer.closeAll();
                }
            });
        }
    

    controller:

    @Controller
    @RequestMapping(value = "/login" , method = {RequestMethod.GET,RequestMethod.POST})
    @Slf4j
    public class LoginController {
        @RequestMapping(value = "/toLogin", method = RequestMethod.GET)
        public String toLogin() {
            return "login";
        }
    
        @RequestMapping(value = "/doLogin", method = RequestMethod.POST)
        //@PostMapping("/doLogin")
        @ResponseBody
        public RespBean doLogin(@RequestBody LoginVo loginVo) {
            log.info("{}", loginVo.toString());
            System.out.println(loginVo.toString());
    
            return null;
        }
    
    }
    

    在浏览器输入 http://localhost:8080/login/toLogin 可以访问到页面,然后点击登录调用 doLogin()方法,前后后端没有报错,但是后端的打印也不会打印到控制台;但是去掉 @RequestMapping(value = "/login" , method = {RequestMethod.GET,RequestMethod.POST})类上面这个 method 的话会报 405 post not support 。 并且使用 postman 调用接口都会报 404,排查了好久都没有解决。

    16 条回复    2021-05-26 20:36:38 +08:00
    Loku
        1
    Loku  
       2021-05-25 18:31:08 +08:00
    加上 contentType: "application/json"
    JSON.parse 换成 JSON.stringify()
    karlguo7
        2
    karlguo7  
    OP
       2021-05-25 18:36:34 +08:00
    @Loku 加上之后后端的打印还是没有,chrome 里面 g_showLoading(); 以下的断点都不会进入 debug 。
    wangsongyan
        3
    wangsongyan  
       2021-05-25 18:36:44 +08:00 via iPhone
    JSON.parse
    sheeta
        4
    sheeta  
       2021-05-25 18:40:53 +08:00
    sheeta
        5
    sheeta  
       2021-05-25 18:43:36 +08:00
    @sheeta 忽略...
    chendy
        6
    chendy  
       2021-05-25 20:24:25 +08:00
    浏览器 cmd + alt + i 开开发工具,切到网络,看看请求的 content-type 和 payload 是什么
    beichenhpy
        7
    beichenhpy  
       2021-05-25 20:25:33 +08:00
    检查 cors 跨域
    hello2060
        8
    hello2060  
       2021-05-25 20:44:57 +08:00
    js 里肯定要改成 data: JSON.stringify(data)

    而且你 LoginVo 定义是什么?
    hello2060
        9
    hello2060  
       2021-05-25 20:47:25 +08:00
    你可以自己用 postman post 到 /login/doLogin 先试试请求能不能到, 甚至可以把 LoginVo 类型改成 String 看能不能收到.

    debug 总是一步步来的. 如果
    1 String 能收到
    2 LoginVo 能收到

    那就是 js 端的问题了
    cslive
        10
    cslive  
       2021-05-26 08:47:32 +08:00
    去掉 @RequestBody
    karlguo7
        11
    karlguo7  
    OP
       2021-05-26 14:07:00 +08:00
    @hello2060 LoginVo 定义了两个 String 的字短,postman 中不管调用 get 还是 post api 都会报 404
    karlguo7
        12
    karlguo7  
    OP
       2021-05-26 14:08:59 +08:00
    @hello2060 js 已经改掉了
    karlguo7
        13
    karlguo7  
    OP
       2021-05-26 14:34:02 +08:00 via iPhone
    @hello2060 #9 下面是 controller 和 postman 的截图,请问是 postman 配置的有问题吗?一直都是 404
    https://i.loli.net/2021/05/26/pToMZReWvSJbju7.jpg?width=1748&height=512 https://i.loli.net/2021/05/26/HTf3dZQNBMeE9VP.jpg?width=1708&height=946
    hello2060
        14
    hello2060  
       2021-05-26 14:48:26 +08:00
    @karlguo7 你这样子后端是拿不到参数的,你至少要指定 mobile 是 pathVariable 还是 requestBody, 是 string 还是 自定义类型.

    但即使这样,后端的断点是会触发的,只不过你的 mobile 是 null
    karlguo7
        15
    karlguo7  
    OP
       2021-05-26 20:35:12 +08:00
    @hello2060 确实是 js 的问题...
    ```JavaScript
    function doLogin(){
    g_showLoading();//显示 loading 动画

    var mobile = $("#mobile").val();
    var inputPassword = $("#password").val();
    var salt = g_password_salt;
    var str = "" + salt.charAt(0) + salt.charAt(2) + inputPassword + salt.charAt(5) + salt.charAt(4);
    var password = md5(str);//md5 加密
    .......
    }
    ```
    JS 里面的 doLogin()调用的 g_showLoading()方法可能有问题,注释掉这个方法下面 js 的 debug 也进去了,后端也进去了,感谢。
    karlguo7
        16
    karlguo7  
    OP
       2021-05-26 20:36:38 +08:00
    @hello2060 但是 postman 不管是 get 还是 post 请求还是会报 404 page not found
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2212 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 41ms · UTC 01:54 · PVG 09:54 · LAX 18:54 · JFK 21:54
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.