弹簧和ExtJS“400错误请求”与PUT但不与POST

时间:2011-09-10 16:17:21

标签: java javascript spring extjs

我正在尝试将带有PUT的参数从JavaScript发送到Spring应用程序。这是Spring Controller中的@RequestMapping:

@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 Bad Request”描述“客户端发送的请求在语法上不正确()”。

如果我查看Firebug,就会有一个带有我所有参数的PUT选项卡,并且参数拼写正确,因为如果我从PUT切换到POST两端都可以正常工作。

我想知道可能出现什么问题,PUT是否仅限于@PathVariable参数,还是可以发送类似POST的参数?

2 个答案:

答案 0 :(得分:2)

我认为你不能使用请求方法PUT将参数传递给spring,因为servlet API中存在限制。您只能使用实现restful服务的PUT方法,将数据作为请求主体传递,在其他情况下(如Spring MVC Databinding)PUT将无法工作。 见SpringMVC is not recognizing request body parameters if using PUT

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

答案 1 :(得分:0)

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

话虽如此,更好,更简单的解决方法是从javascript/jQuery调用中传递数据元素,并将您的参数作为网址本身的一部分传递。意思是,在网址字段中设置参数,就像在GET调用中一样。

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

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