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了