Как я могу эмулировать PUT / DELETE для Rails и GWT?

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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
11
0
5 704
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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');

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

  • Используйте тот же стиль URL-адреса, например / request_builders / 1 (URL-адреса RESTful).
  • Включить скрытые поля (трюк с Rails)

К сожалению, это нельзя считать законченным решением, поскольку оно работает только для данных (форм) в кодировке URL и не работает с JSON или XML, которые являются более распространенным способом выполнения запросов с GWT.

skrat 24.11.2009 16:26

Как сказал @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 по адресу.

Другие вопросы по теме