SpringMVC 接收前端传递的参数

SpringMVC 接受前端传参


1、前端传参需要注意请求的Content-type, 主要使用的有两种:

  • application/x-www-form-urlencoded
  • application/json

application/x-www-form-urlencoded是浏览器的默认编码格式 ,对于原生的form 表单提交参数,就是使用的这种方法,参数格式编码后会成为:key1=value1&key2=value2这样的形式

它支持get和post两种方式进行发送

  • 对于get请求方式,会将编码后的参数“key1=value1&key2=value2”添加到url的结尾。
  • 对于post方式的请求,会放在请求的body中。

对于以这种编码方式进行传输的请求参数,Controller端可以直接通过 在方法中指定对应的参数名进行接收,或者通过Bean进行接收,Bean的成员变量名与请求的方法进行对应

前端方法:

xx.net.ajax({
      url: `xx/test`,
      method: 'get',
      data: { id: 1, name: "50" },
      success: data => {
        console.log("ok")
      }
    });

如果这时在后端加注解@RequestBody,那么会报错:

org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'application/x-www-form-urlencoded;charset=UTF-8' not supported

 其实不加注解也可以接收:

这里打破了我的认知,

我一直以为前端单个单个的参数, 后端用用基本类型或者string接收

前端传对象或者json,后端用bean接收

原来前端传单个单个的参数, 后端也可以用been接收, 以下实测:

 小知识点: 

        1. 日期传参可以直接用xx-xx-xx, 记得在后端字段设置格式

        2. 后端用对象, 接收到了x-www-form-urlencoded类型的参数, 名称一样才能匹配上

2、如果前端框架,通过将参数通过JSON.stringfy(params)转换成为JSON字符串形式,那么以application/x-www-form-urlencoded进行传输的时候,实际传送的参数会是: 

{"id":1,"name":"50"}: 
//这样的参数是不符合key-value形式的,
因为转完之后实际上参数成为了json字符串,而非key=value&key=value字符串

这样的参数,通过get发送时,会变成这样:

 http://localhost:8080/iwatch/api/v2/dashboard/test?{%22id%22:1,%22name%22:%2250%22}

 //实际上是对 {"id":1,"name":"50"}: 这样的字符串进行了转码
 //view source:{%22id%22:1,%22name%22:%2250%22}
 //view pased:{"id":1,"name":"50"}:

通过post发送时会是这样:

//view parsed: {"id":1,"name":"50"}: 
//view source: {"id":1,"name":"50"}: 

这样的形式,这样在后端就会接收不到参数.因此对于将参数转换为JSON字符串之后,需要将content-type指定为:application/json,才能够正确的传输.并且需要配合使用post方法发送请求。

3、如果将参数对象转为了JOSN字符串,后端接受参数较为严格:

a、使用content-type指定为application/json

b、需要配合使用post方法,才能发送成功

xx.net.ajax({
      url: `xx/test`,
      method: 'post',
      data: JSON.stringify({ id: 1, name: "50" }),
      success: data => {
        console.log("ok")
      }
    });

c、后端需要指定:@RequestBody来 将参数绑定到bean .(可以默认为@RequestBody为application/json编码格式服务)

@RequestMapping("/test")
@ResponseBody
public String test(@RequsetBody User vo){ // Long id;String name
        System.out.println(vo.getId());
        return "ok";
    }

 d、当前端使用application/json编码,并且参数为json字符串后,就只能以post方法发送请求了,否则get请求后面的参数为一个urlEncode之后的json字符串,根本没法发送参数。

http://localhost:8080/test?{%22id%22:1,%22name%22:%2250%22}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值