Как я могу эмулировать PUT / DELETE для Rails и GWT? - PullRequest
11 голосов
/ 13 ноября 2008

Я хотел бы сделать свое приложение несколько REST-совместимым. Я использую Rails на бэкэнде и GWT на фронтэнде. Я хотел бы делать обновления и удаления. Я понимаю, что могу сделать что-то вроде mydomain.com/:id/delete (GET) и выполнить то же самое. Однако, как я уже говорил ранее, я хотел бы иметь REST-совместимый бэкэнд. Таким образом, я хочу сделать mydomain.com/:id (DELETE) и заставить его неявно вызывать мой метод удаления.

Теперь я понимаю, что если браузер (мой браузер GWT RequestBuilder) не поддерживает DELETE / GET, Rails каким-то образом выполняет эту задачу с помощью POST и некоторого другого параметра url. Итак, как я могу сделать это с GWT RequestBuilder?

Ответы [ 2 ]

7 голосов
/ 13 ноября 2008

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. То же самое для удаления, но скаффолд сделает это с небольшим количеством Javascript:

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

Чтобы эта работа работала с другим интерфейсом, вам нужно:

  • Использовать URL-адрес того же стиля, например / request_builders / 1 (RESTful URLs)
  • Включить скрытые поля (трюк с Rails)
6 голосов
/ 02 июня 2011

Как сказал @skrat, обходной путь _method=PUT не работает для любого типа тела, где Content-Type не равно x-www-form-urlencoded, например. XML или JSON. К счастью, есть обходной путь заголовка:

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

Итак, чтобы обновить ресурс REST, просто выполните POST по его адресу и добавьте заголовок X-HTTP-Method-Override: PUT. Rails будет интерпретировать это как PUT по адресу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...