请求参数和 PUT 方法

Posted

技术标签:

【中文标题】请求参数和 PUT 方法【英文标题】:Request params and PUT method 【发布时间】:2011-11-03 23:35:55 【问题描述】:

我正在尝试在基于 Grails 的应用程序中获取 PUT 请求传递的请求参数。

我正在使用以下客户端代码发出请求:

$.ajax(
    url: 'api/controllerName/anId',
    type: 'PUT',
    data: $('form').serialize()
)

具有以下映射:

"/api/$controller/$id?" 
    action = [ GET: "read", POST: "create", PUT: "update", DELETE: "delete"]

但是我的控制器的操作接收到空的参数列表,只有 id 值。我试图将其内容写入日志并仅看到:

[id:anId, action:[GET:read, POST:create, PUT:update, DELETE:delete], controller:controllerName]

request.getParameterNames() 返回空值列表。

正如我从 FireBug 看到的,请求包含此参数,并且 Content-Type 为 application/x-www-form-urlencoded; charset=UTF-8

如果我使用 GET/POST 方法 - 一切都按预期工作,我可以获得所有传递的参数。

如何访问传递的参数?

更新:我刚刚发现 PUT 意味着在正文中将数据作为 JSON/XML 传递。顺便说一句,这个问题仍然是实际的,以防万一

【问题讨论】:

所以请求 确实 实际上会发送到您的 update 方法(即通过使用 PUT 方法的映射正确路由)? 好的,我只是排除了这可能是浏览器的问题和不常用的 PUT 方法。 戴夫,谢谢!是的,我已经将它们作为正文传递(因为它由 jQuery 实现)。我使用 PUT 只是因为我正在尝试制作有效的 REST API。在这种情况下您可以提出什么建议? 我可以使用 GET/POST,但它会是无效的 RESTful API。据我所知,PUT 是专门为此制作的,用于通过 url 更新现有对象。你可以阅读更多关于 RESTful ibm.com/developerworks/webservices/library/ws-restful @DaveRandom,关于 POST 与 PUT 的好答案:***.com/questions/630453/put-vs-post-in-rest 【参考方案1】:

我今天遇到了完全相同的问题,并且能够解决它。我使用 JQuery 向 Grails RESTful WebService 发出了 ajax 请求(方法:“PUT”),但参数映射为空。

只想在这里分享我的解决方案。

我必须 JSON.stringify 我的数据并将 contentType 设置为“application/json”,然后在我的 Grails 控制器中使用 request.JSON(如前所述)。

示例(JQuery Ajax 请求):

$.ajax(
        url: "/entries/" + id,
        contentType: "application/json",
        type: "PUT",
        dataType: "json",
        data: JSON.stringify('name' : name, 'date': date),
        success: function(msg) 
            console.log('updated...')
            $.mobile.changePage($('#list'));
        

之后我可以使用:

request.JSON

在我的控制器中以获取 ajax 请求发送的数据(参数仍然为空)。 如果我没有使用 JSON.stringify 并设置内容类型,则会出现以下 Grails 错误:

Error 2012-04-03 13:50:20,046 [http-bio-8080-exec-3] ERROR errors.GrailsExceptionResolver  - IllegalStateException occurred when processing request: [PUT] /entries/2
getReader() has already been called for this request. Stacktrace follows:
Message: getReader() has already been called for this request

我正在使用 Grails 2.0.1 和 JQuery 1.7.1

【讨论】:

老兄,@mburri 你太棒了。我遇到了完全相同的问题,我不得不使用 POST 进行更新,这让我很恼火。有趣的是,当我执行 PUT 时,不需要客户端上的“contentType:'application/json'”。 request.JSON 仍然包含数据。但是当我进行 POST 时,需要“contentType:'application/json'”。但当然,最好的做法是说明您要发送的内容。非常感谢! +1 对于 PUT 必须同时使用 contentType 和 stringify(),感谢您的回答! 我想知道这是否是一个 Jquery+grails 问题,因为当我使用 curl 而不是使用 jquery 进行测试时,grails 端可以正常工作。【参考方案2】:

尝试 request.JSON(或 request.XML)而不是 params。

【讨论】:

以上是关于请求参数和 PUT 方法的主要内容,如果未能解决你的问题,请参考以下文章

delete post put get请求参数

springboot接收delete或者put方法体参数

jmeter之put请求处理

spring mvc 坑之PUT方法接收不到请求参数

requests 请求参数口诀

requests不带参数的get请求和带get参数请求