HTML<form>标签的enctype发起的post请求,在springmvc的controller接收方式,form传json参数

惯例,讲讲故事背景;

  需求:需要将一个图层的Json字符串传入到后端去,并将这个字符串转换为shp文件,再将shp文件放入压缩包,下载到本地。

  遇到的问题:因为一个图层的json字符串会非常大,所以get请求是不行的,所以需要使用post请求;

  所以工作内容就是:使用form表单去post这个json,然后下载shp文件到本地。

 

先说下:application/x-www-form-urlencoded 与 application/json区别

  两种请求方式对服务器端都没什么影响

  application/x-www-form-urlencoded方式是比较老的一种方式,这种方式的好处就是浏览器都支持,以键值对形式key1=value1&key2=value2的方式发送到服务器。

  application/json,随着json规范的越来越流行,并且浏览器支持程度原来越好,许多开发人员易application/json作为请求content-type。


举例. 向服务器发送数据 {a:"a", b:"b"}
  如果头的格式是application/x-www-form-urlencoded, 则ajax.send("a='a'&b='b'");
  如果头的格式是application/json, 则ajax.send(JSON.stringify(data));

 

本例:

当使用form去提交你的json时,http的请求格式默认为:application/x-www-form-urlencoded;

  即使设施为:application/json,就会产生如下报错:

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

  (这里的具体原因),没有深入研究

 

笔者预期传入的数据格式为:{shpJson:"图层json对象字符串,esriJson或GeoJson",name:"导出图层的名称"}

由于这个原因的存在,在springmvc的controller中;

  使用(@RequestBody Object obj )去接受参数解析不方便

  并且存在接到收后转码的问题;

  笔者估计是form传输请求数据的格式默认是:application/x-www-form-urlencoded

所以,笔者使用(@RequestParam("shpJson") String shpJson, @RequestParam("name") String name)去接受参数

拿到json和name后就可以自由处理了

 

但是当笔者实现过后,发现,在form中,参数写json格式时,form最终提交的参数莫名变成了一个 "  {  "!!!!!!!!!!!!

原来需要在前端对json进行编码处理:

encodeURI(你的json字符串)

在接口中接收到的string进行反编码

java.net.URLDecoder.decode(shpJson, "UTF-8")

 最终就能回去到你自己的json了

posted @ 2020-06-08 14:29  MobiusMap  阅读(647)  评论(0编辑  收藏  举报