如何将 @RequestBody 与 JSONP 请求一起使用?
Posted
技术标签:
【中文标题】如何将 @RequestBody 与 JSONP 请求一起使用?【英文标题】:How to use @RequestBody with a JSONP request? 【发布时间】:2013-08-20 12:54:57 【问题描述】:由于集群环境中的跨域问题,我正在尝试使用 jsonp 数据类型执行 ajax 请求。
我可以向没有 @RequestBody 参数的映射方法发出 jsonp 请求,但是当我尝试使用 @RequestBody 参数实现 RequestMapping 时,我收到 415 Unsupported Media Type 错误。
通常当我遇到这个问题时,这是由于某些属性在发布的 json 对象和它在 Spring 中映射到的 Java 对象之间没有正确映射。但我能找到的唯一差异是,使用 jsonp 它添加了一个名为回调的参数和一个名称为下划线“_”的参数
所以我将标签 @JsonIgnoreProperties(ignoreUnknown = true) 添加到我的 Java 对象中,并认为应该可以解决这个问题,但是它仍然抛出这个错误。
我还有什么需要做的吗?
编辑:我现在在 Spring 的调试日志输出中看到了这个堆栈跟踪: org.springframework.web.HttpMediaTypeNotSupportedException:不支持内容类型“application/octet-stream”
$.ajax(
url : 'http://blah/blah.html',
data : abc : '123' , (I also tried to JSON.stringify the object but no difference)
dataType : 'jsonp',
success : function(response)
alert('ok '+JSON.stringify(response));
,
fail : function(response)
alert('error'+JSON.stringify(response));
);
Spring 控制器是:
@RequestMapping( "blah/blah" )
@ResponseBody
public ReturnObject getBlahBlah (@RequestBody MyObject obj) throws Exception
参数对象为:
@JsonIgnoreProperties(ignoreUnknown = true)
public class MyObject
private String abc;
// getter and setter for abc auto generated by MyEclipse
我在 Controller 方法上有一个断点,它永远不会被命中。
【问题讨论】:
【参考方案1】:JSONP 意味着 jQuery 将创建一个 <script>
元素,其中 src
指向您的控制器 URL。
如您所见,这种方法不允许您在请求正文中传递任何数据,所有数据都应作为查询参数在 URL 中传递。 data : abc : '123'
表示将abc=123
添加到 URL 中。
在控制器端,您需要使用@RequestParam
(绑定单个参数)或@ModelAttribute
(绑定多个参数到一个对象):
public ReturnObject getBlahBlah (@RequestParam("abc") int abc) throws Exception ...
【讨论】:
感谢您的澄清!我怀疑它是这样的......好吧,我会相应地改变它(从不使用 ModelAttribute 将多个参数分组到一个对象中,但这就是我需要的)。我唯一担心的是,由于查询字符串长度限制(255 个字符?),我会遇到许多参数问题。或者我可以将 POST 方法类型与 jsonp 一起使用? JSONP 只是 GET - POST 是不可能的。您可以编写一个代理控制器来执行此操作(您的 AJAX 通过 POST 在您的应用程序中调用一个控制器,然后将请求转发到外部 URI 并将响应转发回您的应用程序)。以上是关于如何将 @RequestBody 与 JSONP 请求一起使用?的主要内容,如果未能解决你的问题,请参考以下文章