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に移動し、[新規] をクリックして 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 リクエストをシミュレートする隠しフィールドがありました。削除も同様ですが、scaffold は Javascript を少し使ってそれを行います:

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

これを別のフロントエンドで動作させるには、次の両方が必要です。

  • /request_builders/1 などの同じスタイルの URL を使用する (RESTful URL)
  • 隠しフィールドを含める (Rails トリック)
于 2008-11-13T07:46:36.113 に答える
6

@skrat が言ったように、この回避策はXML や JSON など、そうでない_method=PUTあらゆる種類のボディでContent-Typeは機能しません。x-www-form-urlencoded幸いなことに、ヘッダーの回避策もあります。

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

したがって、REST リソースを更新するには、そのアドレスに POST を実行し、ヘッダーを追加するだけですX-HTTP-Method-Override: PUT。Rails はこれをアドレスへの PUT として解釈します。

于 2011-06-02T05:48:44.110 に答える