2011-09-10 63 views
0

我试图用PUT从JavaScript将参数传递给Spring应用程序。这里是一个春天控制器的@RequestMapping:Spring和ExtJS的“400错误的请求”与PUT但与POST

@RequestMapping(value = "toggle-paid-action", method = RequestMethod.PUT) 
@ResponseBody 
public final String togglePaid(@RequestParam final int year, 
    @RequestParam final String docType, @RequestParam final int number) { 

这里是应该发送这些参数的JavaScript代码段。

Ext.Ajax.request({ 
    params: {year: year, docType: docType, number: number}, 
    url: 'toggle-paid-action', 
    method: 'PUT', 

不过,我得到一个“400错误的请求”与描述,每次“客户端发送的请求是语法不正确的()”。

如果我使用Firebug检查,有一个与我的所有参数的PUT选项卡和参数的拼写正确,因为如果我从PUT切换到职位上双方一切正常。

我想知道什么可能是这个问题,放在仅限于@PathVariable参数,也可以发送POST也类似参数?

+0

你检查,[这个问题](http://stackoverflow.com/questions/5521173/spring-framework-enable-put-method)?它建议使用'String'或模型类而不是'int/Integer'和一些关于默认方法的信息。 – sjngm

回答

2

我想你不能传递参数使用请求方法PUT,因为是servlet API在一个限制弹簧。您只能使用PUT方法来实现宁静的服务,将数据作为请求主体传递,而在其他情况下(如Spring MVC Databinding)PUT将不起作用。 看到SpringMVC is not recognizing request body parameters if using PUT

JIRA: https://jira.springsource.org/browse/SPR-7414

+0

啊有趣,所以这是Servlet API的一个限制,但是HTTP协议会允许它,我想。我会试用@RequestBody,谢谢。 – stivlo

0

此,如上述建议,似乎是在spring/servlet API的错误。实际上,PUT请求应该在Request Body (or payload)上工作,而不是在请求参数上。从这个意义上说,servlet API & spring的处理是正确的。

说了这么多,更好的和更容易的解决办法是没有数据元素从javascript/jQuery呼叫传递并通过您的参数作为URL本身的一部分。意思是,你可以在GET调用中设置url字段中的参数。

$.ajax({ 
      url: "yoururl" + "?param1=param2Val&..", 
      type: "PUT", 
      data: "", 
      success: function(response) { 
       // .... 
      } 
    }); 

现在这适用于简单的参数,我猜,将不适用于复杂的JSON类型。希望这可以帮助。