11

我想让我的应用程序有点 REST 兼容。我在后端使用 Rails,在前端使用GWT。我想做更新和删除。我意识到我可以做类似 mydomain.com/:id/delete (GET) 的事情并完成同样的事情。但是,正如我之前所说,我希望有一个符合 REST 的后端。因此,我想做 mydomain.com/:id (DELETE) 并让它隐式调用我的删除方法。

现在,我的理解是,如果浏览器(我的浏览器是 GWT RequestBuilder)不支持 DELETE/GET,Rails 会通过 POST 和其他一些 url 参数以某种方式完成此任务。那么,如何使用 GWT RequestBuilder 来完成此任务?

4

2 回答 2

7

Rails 通过隐藏属性做到这一点。解决这个问题的最简单方法是创建一个新的 rails 应用程序,生成一个脚手架并在浏览器中查看 HTML。

试试这个:

rails jp
cd jp
./script/generate scaffold RequestBuilder name:string
rake db:migrate
./script/server 

然后导航到http://localhost:3000/request_builders,单击 New 并查看 HTML。你会看到类似的东西:

<form action="/request_builders" class="new_request_builder" 
  id="new_request_builder" method="post">
  <div style="margin:0;padding:0">
    <input name="authenticity_token" type="hidden" value="e76..." />
  </div>

这是一个创造,方法是POST。输入名称,保存然后编辑:

<form action="/request_builders/1" class="edit_request_builder" 
  id="edit_request_builder_1" method="post">
  <div style="margin:0;padding:0">
    <input name="_method" type="hidden" value="put" />
    <input name="authenticity_token" type="hidden" value="e76..." />
  </div>

当然表单是通过 POST 发送的,但是 Rails 有一个隐藏字段来模拟 PUT 请求。删除也一样,但脚手架会用一点 Javascript 来完成:

var m = document.createElement('input'); 
m.setAttribute('type', 'hidden'); 
m.setAttribute('name', '_method'); 
m.setAttribute('value', 'delete');

要将这项工作与另一个前端一起使用,您必须同时具备以下条件:

  • 使用相同样式的 URL,例如 /request_builders/1(RESTful URL)
  • 包括隐藏字段(Rails 技巧)
于 2008-11-13T07:46:36.113 回答
6

就像@skrat 所说,该解决方法_method=PUT不适用于任何类型的主体,例如 XML 或 JSON。幸运的是,还有一个标题解决方法:Content-Typex-www-form-urlencoded

https://zcox.wordpress.com/2009/06/17/override-the-http-request-method-in-jersey/

因此,要更新 REST 资源,只需对其地址执行 POST 并添加 header X-HTTP-Method-Override: PUT。Rails 会将其解释为对地址的 PUT。

于 2011-06-02T05:48:44.110 回答