【问题标题】:Spring and ExtJS "400 Bad Request" with PUT but not with POSTSpring 和 ExtJS “400 Bad Request” 带有 PUT 但不带有 POST
【发布时间】:2011-09-10 16:17:21
【问题描述】:

我正在尝试将带有 PUT 的参数从 JavaScript 发送到 Spring 应用程序。这是 Spring 控制器中的 @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 sn-p。

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 的参数?

【问题讨论】:

  • 你检查过this question吗?它建议使用String 或模型类而不是int/Integer 以及一些有关默认方法的信息。

标签: java javascript spring extjs


【解决方案1】:

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

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

【讨论】:

  • 很有趣,所以这是 Servlet API 的限制,但我想 HTTP 协议会允许它。我将尝试@RequestBody,谢谢。
【解决方案2】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2014-05-14
    • 2020-04-17
    • 1970-01-01
    • 2016-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多