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





Rails делает это со скрытыми атрибутами. Самый простой способ понять это - создать новое приложение rails, сгенерировать каркас и просмотреть HTML-код в браузере.
Попробуй это:
rails jp
cd jp
./script/generate scaffold RequestBuilder name:string
rake db:migrate
./script/server
Затем перейдите к http: // локальный: 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. Введите имя, сохраните, затем Edit:
<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');
Чтобы это работало с другим интерфейсом, вам необходимо:
Как сказал @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 по адресу.
К сожалению, это нельзя считать законченным решением, поскольку оно работает только для данных (форм) в кодировке URL и не работает с JSON или XML, которые являются более распространенным способом выполнения запросов с GWT.