Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 358|回复: 0

angular的post请求,SpringMVC后台接收不到参数值的解决方案

[复制链接]
  • TA的每日心情
    奋斗
    2024-11-24 15:47
  • 签到天数: 804 天

    [LV.10]以坛为家III

    2053

    主题

    2111

    帖子

    72万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    726782
    发表于 2021-6-8 13:51:10 | 显示全部楼层 |阅读模式

    这是我后台SpringMVC控制器接收isform参数的方法,只是简单的打出它的值:

    @RequestMapping(method = RequestMethod.POST)
    @ResponseBody
    public Map<String, Object> save(
    @RequestParam(value = "isform", required = false) String isform) {
    System.out.println("isform value: " + isform);
    return null;

    }

    前台页面发送一个post提交表单的请求

    发现后台没有取到值

    后边我想到的第一种方案是在控制器方法参数里加requestbody来接收json参数,改成如下:

    @RequestMapping(method = RequestMethod.POST) @ResponseBody public Map<String, Object> save( @RequestParam(value = "isform", required = false) @RequestBody String isform) { System.out.println("isform value: " + isform); return null; }

    但是isform的值结果还是为null,

    接着我又对比了下以前的项目中,接收post请求的参数,发现一个有趣的现象,

    下边是Angular的默认请求头,

    $httpProvider.defaults.headers.post: (header defaults for POST requests)

    Content-Type: application/json

    $httpProvider.defaults.headers.put(header defaults for PUT requests)

    Content-Type: application/json

    其中Angular的post和put都是application/json,

    而jquery的post请求的"Content-Type"默认为" application/x-www-form-urlencoded",于是我更改了angular的默认Content-Type,

    app.config(function($httpProvider) { $httpProvider.defaults.headers.put['Content-Type'] = 'application/x-www-form-urlencoded'; $httpProvider.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded'; });

    接下来的请求body变成了这样,但是后边还是没有取到isform的值,

    又查了半天,在一个老外的博客上发现了原因,链接如下:

    http://victorblog.com/2012/12/20/make-angularjs-http-service-behave-like-jquery-ajax/

    By default, jQuery transmits data using Content-Type: x-www-form-urlencoded and the familiar foo=bar&baz=moe serialization. AngularJS, however, transmits data using Content-Type: application/json and { "foo": "bar", "baz": "moe" } JSON serialization

    自己翻译了:

    默认情况下,jQuery传输数据使用Content-Type: x-www-form-urlencodedand和类似于"foo=bar&baz=moe"的序列,然而AngularJS,传输数据使用Content-Type: application/json和{ "foo": "bar", "baz": "moe" }这样的json序列。

    所以下把Content-Type设置成x-www-form-urlencodedand之后,还需要转换序列的格式,

    下边是我经过老外实践而自己测试过的最终方案:

    app.config(function($httpProvider) {
    $httpProvider.defaults.headers.put['Content-Type'] = 'application/x-www-form-urlencoded';
    $httpProvider.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';

    // Override $http service's default transformRequest
    $httpProvider.defaults.transformRequest = [function(data) {
    /**
    * The workhorse; converts an object to x-www-form-urlencoded serialization.
    * @param {Object} obj
    * @return {String}
    */
    var param = function(obj) {
    var query = '';
    var name, value, fullSubName, subName, subValue, innerObj, i;

    for (name in obj) {
    value = obj[name];

    if (value instanceof Array) {
    for (i = 0; i < value.length; ++i) {
    subValue = value;
    fullSubName = name + '[' + i + ']';
    innerObj = {};
    innerObj[fullSubName] = subValue;
    query += param(innerObj) + '&';
    }
    } else if (value instanceof Object) {
    for (subName in value) {
    subValue = value[subName];
    fullSubName = name + '[' + subName + ']';
    innerObj = {};
    innerObj[fullSubName] = subValue;
    query += param(innerObj) + '&';
    }
    } else if (value !== undefined && value !== null) {
    query += encodeURIComponent(name) + '='
    + encodeURIComponent(value) + '&';
    }
    }

    return query.length ? query.substr(0, query.length - 1) : query;
    };

    return angular.isObject(data) && String(data) !== '[object File]'
    ? param(data)
    : data;
    }];
    });

    在angular模块中添加以上代码,我们来看下效果:

    发现与jquery的post请求风格一致了,有木有!!!

    看下后台的参数接收情况,

    isform已经可以正常接收到参数了,大功告成!

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-2-2 12:03 , Processed in 0.057828 second(s), 27 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表