2008-11-13 3 views
11

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

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

ответ

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. Введите имя, сохранить затем 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 HADS скрытого поля для имитации запроса 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 трюк)
+2

К сожалению, это не может считаться полным решением, поскольку оно работает только для кодированных URL-адресов (форм) и не работает с JSON или XML, что является более распространенным способом выполнения запросов с GWT – skrat 2009-11-24 13:26:53

6

Как @skrat словам, _method=PUT обходной путь не работает для любого вида тела WHe re 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 для адреса.

Смежные вопросы