如何将 @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 请求一起使用?的主要内容,如果未能解决你的问题,请参考以下文章

如何在@RequestBody 中自定义将字符串转换为枚举?

如何自动将字符串@RequestBody解析为json

PHP:处理“JSONP”输出与“JSON”及其解析?

jsonp的原理与实现

如何让 JSONP 与 jQuery 一起工作?

JSONP 与 IFrame?