请求参数和 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 方法的主要内容,如果未能解决你的问题,请参考以下文章