Поток RESTful? - PullRequest
       29

Поток RESTful?

1 голос
/ 19 июня 2009

Итак ...

Я уже немного читал о REST , и идея, стоящая за ним, звучит хорошо, но вопрос в том, может ли она быть легко интегрирована в стандартный поток веб-страницы?

Например, пользователь создает какой-то элемент, сообщение в блоге или что-то еще, и теперь он хочет удалить его, поэтому он щелкает ссылку «удалить» на странице. Что теперь? Как мы выдаем запрос DELETE, скажем, на http://mysite.com/posts/5? И как мы справимся с этим запросом? У меня нет опыта работы с cURL или чем-то еще, но, судя по всему, мне нужно было бы curl_init('http://mysite.com/posts/5') и затем поработать с магией. Но где бы я даже положил этот сценарий? Это должно быть на другой странице, которая сломает всю идею REST. Тогда я просто GET использовал бы другую страницу, которая, в свою очередь, DELETE была бы страницей, которую я первоначально намеревался?

Вот почему люди редко используют REST или на самом деле есть хороший способ сделать это?


Похоже, мне нужно уточнить. Люди предлагают, чтобы я включил в URL такие слова, как «DELETE» и «POST». Я считаю, что REST диктует, что у нас есть уникальный URL для каждого ресурса , но , а не для каждого действия на этом ресурсе. Я предполагаю, что это также означает, что у нас есть только один и только один URL для каждого ресурса. я хочу иметь возможность УДАЛИТЬ или ПРОСМОТРЕТЬ содержимое определенного поста с одного URL (отправив DELETE, PUT, POST или GET), а не с разных URL с дополнительными параметрами

Ответы [ 8 ]

6 голосов
/ 19 июня 2009

На сервере для отдыха один и тот же URL (скажем, / books / 1) может отвечать на множество различных глаголов. Эти глаголы GET, POST, PUT и DELETE вместе с путем указывают , что вы хотите сделать с данными на сервере . В ответе сообщается ответ на ваш запрос.

REST - это доступ к данным предсказуемым и разумным способом.

Если вы пришли из сильного фона PHP, где каждый URL-адрес должен отображаться в определенный файл, вы правы, это не имеет смысла. В двух наиболее заметных средах разработки RESTful, ASP.NET MVC и Rails, каждая имеет специальные серверы (или серверную логику), которые читают глаголы и выполняют эту специальную маршрутизацию для вас. Это то, что позволяет «нормальному потоку» приложения проходить так, как вы ожидаете. Для PHP есть фреймворки, которые помогают с этим, такие как WSF WSO2 .

Как REST работает с веб-браузерами

Взять, к примеру, ваш пример. У нас есть сообщения, и мы хотим их удалить.

  1. Мы начинаем с посещения URL вроде / posts / 4. Как и следовало ожидать, здесь показан пост 4, его атрибуты и некоторые действия, которые вы можете предпринять. Запрос на рендеринг этого URL будет выглядеть как GET /posts/4. Ответ содержит HTML-код, описывающий элемент.

  2. Пользователь нажимает ссылку «Удалить элемент 4», часть HTML. Это отправляет запрос как DELETE /posts/4 на сервер. Обратите внимание, что здесь повторно использовался /posts/4 url, но логика должна быть другой.

    HTML-форм и веб-браузеров, многие из них по умолчанию заменят ссылку с методом = "удалить" на ссылку метода = "опубликовать". Вам нужно будет использовать Javascript (что-то вроде this ), чтобы изменить глагол. Ruby on Rails использует скрытое поле ввода (_method), чтобы указать, какой метод должен использоваться в форме, в качестве альтернативы.

  3. На стороне сервера выполняется логика «Удалить элемент». Он знает, как выполнить это из-за глагола в запросе (DELETE), который соответствует выполняемому действию. Ключевым моментом REST является то, что глаголы HTTP становятся осмысленными.

  4. После удаления элемента вы могли бы ответить страницей типа «да, готово» или «нет, извините, вы не можете этого сделать», но для браузера имеет смысл поместить вас куда-нибудь остальное. Элемент, удаляемый, имеет смысл перенаправить на GET /posts.

Если вы посмотрите на журнал сервера, станет ясно, что все сделали с сервером, но это не так важно, как ...

Как REST работает с произвольными данными

Еще одним ключевым моментом REST является то, что он хорошо работает с несколькими форматами данных. Предположим, вы писали программу, которая хотела читать и взаимодействовать с блогом программно. Возможно, вам понадобятся все сообщения, представленные в XML, вместо того, чтобы просматривать информацию в HTML.

GET /posts/4.xml интуитивно понятен: «Сервер, пожалуйста, дайте мне xml с описанием поста № 4». Ответ будет таким, что XML. Сервер RESTful делает очевидным, как получить необходимую информацию.

Когда вы сделали запрос DELETE /posts/4.xml, вы спрашиваете: «Сервер, пожалуйста, удалите элемент № 4». Ответа «Хорошо, конечно» обычно достаточно, чтобы выразить, что произошло. Затем программа может решить, чего еще она хочет, и сделать еще один запрос.

1 голос
/ 19 июня 2009

Если у вас действительно нет выбора в использовании глагола DELETE, я бы предложил что-то вроде следующего:

POST http://mysite.com/Trashcan?resourceUrl=/Customer/75

Какой URL вы действительно используете, не имеет значения для REST, однако легче понять способ взаимодействия REST, если ваши URL полностью избегают глаголов.

Я видел так много вопросов от пользователей Rails и ASP.NET MVC, которым нужно выйти за рамки стандартных «действий», и так заманчиво просто добавить новое действие на контроллер. Проблема с этим заключается в том, что вы просто отбросили унифицированное ограничение интерфейса REST.

Метафора мусорной корзины - не единственный способ удаления, но я бы сказал, что читать его так же ясно, как и добавить «delete» в URL.

Вот еще несколько «основанных на существительных» способов замены глаголов.

POST http://mysite.com/Printer/75/PrintQueue?url=http://mysite.com/Document/xyz
POST http://mysite.com/CurrentLogins?user=bob
POST http://mysite.com/QueryProcessor?query=FindMyInformation
POST http://mysite.com/SearchEngine?searchTerms=cat,blue,furry
POST http://mysite.com/OrderProcessor?cart=http://mysite.com/user/2323/cart

Иногда вам нужно немного подумать, чтобы придумать URL, основанный на существительном, и может показаться педантичным попытаться сделать это, но для меня выгода от способности управлять моими переменными. Я собираюсь иметь переменное количество ресурсов в моем интерфейсе, независимо от того, что я делаю, если я могу исправить количество глаголов, которые могут работать с этими ресурсами, тогда я уменьшу одну из моих переменных.

1 голос
/ 19 июня 2009

Не задумывайтесь над этим. Вы не сможете сделать это с помощью простых HTML-форм и браузера. Они не поддерживают метод DELETE . Аякс может сделать это.

Я хочу иметь возможность УДАЛИТЬ для просмотра содержание определенного поста от один URL (отправив либо УДАЛИТЬ, PUT, POST или GET), а не разные URL с дополнительными параметрами

Удалить для просмотра? Я не уверен, что понимаю, но ваше удаление должно быть сделано через заголовки, а не через URL. Метод delete не должен возвращать представление. REST - это сервис , не все запросы предназначены для визуального потребления.

1 голос
/ 19 июня 2009

REST-сервер Facebook является псевдо-сервером, вы можете сделать это, как они, запросив метод post: POST, GET и т. Д. Действие и другие значения, необходимые для этого запроса.

Почему я говорю, что Facebook - это псевдо-REST-сервер? : хорошо, один из Принципов ОТДЫХА говорит

  • Каждый ресурс имеет уникальную адресацию с использованием универсального синтаксиса для использования в гиперссылках

в фейсбуке у вас есть только /server.php и есть место, где вы делаете запрос, даже для (POST, GET, PUT, DELETE ...)

другой способ - использовать mod_rewrite и анализировать URL-адрес, запрашиваемый клиентом

РЕДАКТИРОВАТЬ: только что нашел это , выглядит интересно. Повеселись!

1 голос
/ 19 июня 2009

Я не думаю, что REST редко используется. Вы используете это прямо сейчас, на StackOverflow. Что касается вашего конкретного примера, вы можете отправлять запросы DELETE через XMLHttpRequest в браузерах, которые его поддерживают. Когда JS выключен или для несовместимых браузеров, вы можете сделать что-то вроде:

POST http://foo.com/delete?post=5

Не идеально, но все же более спокойно, чем многие сайты.

РЕДАКТИРОВАТЬ: изменено на POST

1 голос
/ 19 июня 2009

Ну, один из способов - сделать AJAX-вызов методом DELETE.

1 голос
/ 19 июня 2009

В зависимости от того, какую платформу вы используете, существуют модели, определяющие, как действия обрабатываются для каждого ресурса.

В основном, используя другой параметр, вы хотите отправить ресурсу какое действие выполнить. Этот параметр может быть отправлен через AJAX / JS, например.

Если вы хотите сделать это без javascript / ajax (в случае, если он отключен), то также будет работать метод POST формы, посылая ресурсу дополнительный параметр ACTION.

Конечно, в обоих случаях вы должны рассмотреть вопрос о безопасности и убедиться, что они не отправляют ресурсу действие, которым они не должны быть. Обязательно выполните проверку на сервере и отправьте соответствующий ответ или сообщение об ошибке.

Сценарии на стороне клиента, будь то через JS / Ajax или через форму POST или другие методы, требуют дополнительных мер безопасности.

Отредактировано после уточнения с постера.

0 голосов
/ 15 декабря 2009

Еще один способ сделать это, предполагая, что запрос на основе веб / веб-приложения, это 2 кнопки отправки. Так как PUT и DELETE используют один и тот же uri / url. Вы можете добавить определенную форму удаления и прикрепить определенное имя к этой кнопке удаления, поэтому, когда она отправляется по почте, вы можете использовать это имя кнопки, чтобы превратить действие в УДАЛИТЬ

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