Springmvc 的post请求的json格式参数
背景:
这两天在项目中遇到了一个问题。我的环境是springmvc4.1.9,写了几个可以用ajax请求的接口(ajax、jsonp 调用正常)。突然一时兴起就用 HTTP 请求的工具(比如火狐浏览器的插件HTTPRequester,fiddler等等)来访问一下我的接口,然后就傻眼了,传入到后台的方法不能正常得到数据。
分析:
这里我们只做get请求和post 请求 分析。
1) springmvc 的配置方法不说了,保证包含<mvc:annotation-driven/> 即可。
2) 必备的jar 必不可少。springmvc 内置的json 处理包是 jackson,完整引入方式。引入包有jackson-databind,jackson-core,jackson-annotations
1 2 3 4 5 | <dependency> <groupId>com.fasterxml.jackson.module</groupId> <artifactId>jackson-module-jaxb-annotations</artifactId> <version>${jackson.version}</version> </dependency> |
3) 采用注解方式来实现Controller
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | package com.bkc.bpmp.modules.external.controller; import java.io.IOException; import java.util.Map; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import com.bkc.bpmp.modules.external.pojo.ExternalSingleResult; @Controller @RequestMapping ( "/external" ) public class Test { @RequestMapping (value = "/test1" ) @ResponseBody public Object test1( @RequestBody String pageData) throws IOException { System.out.println(pageData); return pageData; } @RequestMapping (value = "/test2" ) @ResponseBody public Object test2( @RequestParam String pageData) throws IOException { System.out.println(pageData); return pageData; } } |
4)对应test2,采用的是 @RequestParam 方式获取的参数
其参数格式就是一般 a=a&b=b 模式
而对于test1,采用的是 @RequestBody 方式获取的参数
其参数格式就是 json格式的字符串,{"a":"valueA","b":"valueB"}
5)在我使用 HTTP请求工具测试 test2 的时候,一直报 415
HTTP 415 错误 – 不支持的媒体类型(Unsupported media type)
因为我设置的请求格式为application/json ,应该为 application/json;charset=UTF-8
6)使用ajax 请求来测试,测试方法如下
在TestAjax()方法中,data 是一个json 数组,用这种方式去发送请求的时候,其实本质上就是参数格式为 a=a&b=b 模式。TestAjax2() 方法,传递的则是 json 字符串
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | function TestAjax() { var datas = { "equObjCode" : "EO_10HLB21AN001.QY-GL01.JZ-01.TY" }; var url = "/external/test2" ; var obj = $( "#result" ); var data = $.parseJSON(datas); $.ajax({ type : "get" , async : false , url : url, data : data, //cache : false, //默认值true dataType : "jsonp" , jsonp : "callback" , //传递给请求处理程序或页面的,用以获得jsonp回调函数名的参数名(默认为:callback) jsonpCallback : "jsonpCallback" , //自定义的jsonp回调函数名称,默认为jQuery自动生成的随机函数名 //如果这里自定了jsonp的回调函数,则success函数则不起作用;否则success将起作用 success : function(data) { obj.html(JSON.stringify(data)); //obj.parent().css("background","#ddd"); }, error : function(XMLHttpRequest, textStatus) { obj.html(XMLHttpRequest.status + "," + XMLHttpRequest.readyState + ",error=" + textStatus); } }); } function TestAjax2() { var datas = { "equObjCode" : "EO_10HLB21AN001.QY-GL01.JZ-01.TY" }; var url = "/external/test1" ; var obj = $( "#result" ); $.ajax({ type : "post" , url : url, data : data, dataType : "json" , contentType : 'application/json;charset=UTF-8' , success : function(data) { obj.html(JSON.stringify(data)); }, error : function(XMLHttpRequest, textStatus) { obj.html(XMLHttpRequest.status + "," + XMLHttpRequest.readyState + ",error=" + textStatus); } }); } |
7)
jsonp 只支持get 请求,不支持post 请求。
post模式下,使用@RequestBody 绑定请求对象,Spring会帮你进行协议转换,将Json、Xml协议转换成你需要的对象。
其他参考:
HTTP Status 415的解决方案 http://www.cnblogs.com/qq78292959/p/3761646.html
作者:panie
出处:http://www.cnblogs.com/panie2015/
如果您希望与我交流互动,欢迎加我微信
本文内容为作者辛苦整理书写,欢迎转载,但请保留文章出处
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?