Различия в веб-сервисах между REST и RPC
У меня есть веб-служба, которая принимает параметры JSON и имеет определенные URL-адреса для методов, например:
http://IP:PORT/API/getAllData?p={JSON}
Это определенно не REST, поскольку он не является апатридом. Он учитывает файлы cookie и имеет свою собственную сессию.
Это RPC? В чем разница между RPC и REST?
Ответы
Ответ 1
Вы не можете сделать четкое разделение между REST или RPC, просто взглянув на то, что вы опубликовали.
Одним из ограничений REST является то, что он должен быть без сохранения состояния. Если у вас есть сеанс, то у вас есть состояние, поэтому вы не можете вызвать свою службу RESTful.
Тот факт, что у вас есть действие в вашем URL (т.е. getAllData
), указывает на RPC. В REST вы обмениваетесь представлениями, а выполняемая вами операция определяется HTTP-глаголами. Кроме того, в REST согласование содержимого не выполняется с параметром ?p={JSON}
.
Не знаю, если ваш сервис RPC, но это не RESTful. Вы можете узнать о разнице в Интернете, вот статья для начала: Разоблачение мифов о RPC и REST. Вы лучше знаете, что находится внутри вашего сервиса, поэтому сравните его функции с RPC и сделайте свои собственные выводы.
Ответ 2
Рассмотрим следующий пример API-интерфейсов HTTP, которые моделируют заказы, размещаемые в ресторане.
- RPC API думает с точки зрения "глаголов", демонстрируя функциональность ресторана как вызовы функций, которые принимают параметры, и вызывает эти функции через HTTP-глагол, который кажется наиболее подходящим - "get" для запрос и т.д., но имя глагола является чисто случайным и не имеет реального отношения к фактической функциональности, поскольку вы каждый раз вызываете другой URL. Коды возврата кодируются вручную и часть контракта на обслуживание.
- REST API, напротив, моделирует различные объекты в проблемной области в качестве ресурсов и использует HTTP-глаголы для представления транзакций с этими ресурсами - POST для создания, PUT для обновления и GET читать. Все эти глаголы, вызываемые по одному и тому же URL, предоставляют разные функциональные возможности. Общие коды возврата HTTP используются для передачи статуса запросов.
Размещение заказа:
Получение заказа:
Обновление заказа:
Пример, взятый из sites.google.com/site/wagingguerillasoftware/rest-series/what-is-restful-rest-vs-rpc
Ответ 3
Как уже говорили другие, ключевое отличие состоит в том, что REST ориентирован на существительное, а RPC - на глагол. Я просто хотел включить эту ясную таблицу примеров, демонстрирующих, что:
---------------------------+-------------------------------------+--------------------------
Operation | RPC (operation) | REST (resource)
---------------------------+-------------------------------------+--------------------------
Signup | POST /signup | POST /persons
---------------------------+-------------------------------------+--------------------------
Resign | POST /resign | DELETE /persons/1234
---------------------------+-------------------------------------+--------------------------
Read person | GET /readPerson?personid=1234 | GET /persons/1234
---------------------------+-------------------------------------+--------------------------
Read person items list | GET /readUsersItemsList?userid=1234 | GET /persons/1234/items
---------------------------+-------------------------------------+--------------------------
Add item to person list | POST /addItemToUsersItemsList | POST /persons/1234/items
---------------------------+-------------------------------------+--------------------------
Update item | POST /modifyItem | PUT /items/456
---------------------------+-------------------------------------+--------------------------
Delete item | POST /removeItem?itemId=456 | DELETE /items/456
---------------------------+-------------------------------------+--------------------------
Заметки
- Как видно из таблицы, REST имеет тенденцию использовать параметры пути URL для идентификации конкретных ресурсов.
(например, GET/persons/1234
), тогда как RPC имеет тенденцию использовать параметры запроса для входных данных функции
(например, GET/readPerson?personid=1234
). - В таблице не показано, как API REST будет обрабатывать фильтрацию, которая обычно включает параметры запроса (например,
GET/persons?height=tall
). - Также не показано, как в любой из систем, когда вы выполняете операции создания/обновления, дополнительные данные, вероятно, передаются через тело сообщения (например, когда вы делаете
POST/signup
или POST/persons
, вы включаете данные, описывающие нового человека). - Конечно, ничего из этого не сделано, но это дает вам представление о том, с чем вы, вероятно, столкнетесь, и о том, как вы можете организовать собственный API для обеспечения согласованности. Для дальнейшего обсуждения дизайна REST URL, посмотрите этот вопрос.
Ответ 4
Это RPC с использованием http. Правильная реализация REST должна отличаться от RPC. Иметь логику для обработки данных, как метод/функцию, - это RPC. getAllData() - это интеллектуальный метод. REST не может иметь интеллект, это должны быть данные дампа, которые могут быть запрошены внешним интеллектом.
Большинство реализаций в наши дни - RPC, но многие ошибочно называют его REST, потому что они видят, что они не используют XML/Soap, а используют HTTP + json. REST с HTTP является спасителем, а SOAP с XML - злодеем. Таким образом, ваше замешательство оправдано, и вы правы, это не ОТДЫХ.
Протокол HTTP не делает реализацию REST. И REST (GET, POST, PUT, PATCH, DELETE) и RPC (GET + POST) могут быть разработаны через HTTP (например, через проект веб-API в visual studio).
RPC стар, и все школьники знают, что такое RPC, и большая часть разработанного REST заканчивается RPC (HTTP + Json), что понятно. Но что такое ОТДЫХ?
Модель зрелости Ричардсона приведена ниже (обобщено). Только уровень 3 - ОТДЫХ.
- Уровень 0: HTTP POST
- Уровень 1: каждый ресурс/объект имеет URI (но все еще только POST)
- Уровень 2. Можно использовать как POST, так и GET
- Уровень 3 (RESTful): использует HATEOAS (гиперссылки) или другими словами self
исследовательские ссылки
например, уровень 3:
- Ссылка утверждает, что этот объект может быть обновлен таким образом, и добавлен таким образом
- Линк заявляет, что этот объект может быть только прочитан, и вот как мы это делаем.
Вы создали веб-сайты, которые могут быть использованы людьми. Но вы также можете создавать веб-сайты, которые можно использовать на машинах? Это где будущее ложь, и RESTful Web Services покажет вам, как это сделать.
Ответ 5
Лучше всего описывать REST для работы с ресурсами, где RPC больше относится к действиям.
REST
означает передачу государственного представительства. Это простой способ организовать взаимодействие между независимыми системами.
Приложения RESTful обычно используют HTTP-запросы для публикации данных (создания и/или обновления), чтения данных (например, создания запросов) и удаления данных. Таким образом, REST может использовать HTTP для всех четырех операций CRUD (Create/Read/Update/Delete).
RPC
в основном используется для связи через разные модули для обслуживания пользовательских запросов.
например В openstack, например, как nova, glance и нейтроны работают вместе при загрузке виртуальной машины.
Ответ 6
Я бы сказал так:
Сохраняет ли моя сущность/владеет данными? Затем RPC: вот копия некоторых моих данных, манипулируйте копией данных, которую я вам пришлю, и верну мне копию вашего результата.
Является ли вызываемая сущность собственностью/данными? Затем REST: либо (1) покажите мне копию некоторых ваших данных, либо (2) обработайте некоторые ваши данные.
В конечном итоге речь идет о том, какая "сторона" действия владеет/хранит данные. И да, вы можете использовать формулировку REST для общения с RPC-системой, но при этом вы будете делать RPC-активность.
Пример 1: У меня есть объект, который связывается с хранилищем реляционных баз данных (или любым другим типом хранилища данных) через DAO. Имеет смысл использовать стиль REST для этого взаимодействия между моим объектом и объектом доступа к данным, который может существовать как API. Моя сущность не владеет/не держит данные, реляционная база данных (или нереляционное хранилище данных) делает.
Пример 2: Мне нужно сделать много сложной математики. Я не хочу загружать кучу математических методов в свой объект, я просто хочу передать некоторые значения чему-то другому, которые могут выполнять все виды математики, и получить результат. Тогда стиль RPC имеет смысл, потому что математический объект/сущность откроет моему объекту целую цепочку операций. Обратите внимание, что все эти методы могут быть представлены как отдельные API, и я мог бы назвать любой из них с помощью GET. Я даже могу утверждать, что это RESTful, потому что я звоню через HTTP GET, но действительно под обложками это RPC. Мой объект владеет/хранит данные, удаленный объект просто выполняет манипуляции с копиями данных, которые я ему отправил.
Ответ 7
Вот как я понимаю и использую их в разных случаях:
Пример: управление рестораном
сценарий использования REST: управление заказами
- create order (POST), update order (PATCH), cancel order (DELETE), retrieve order (GET)
- endpoint: /order?orderId=123
Для управления ресурсами REST является чистым. Одна конечная точка с заранее определенными действиями. Можно увидеть способ раскрытия БД (Sql или NoSql) или экземпляров классов миру.
Пример реализации:
class order:
on_get(self, req, resp): doThis.
on_patch(self, req, resp): doThat.
Пример фреймворка: Сокол для питона.
сценарий использования для RPC: управление операциями
- prepare ingredients: /operation/clean/kitchen
- cook the order: /operation/cook/123
- serve the order /operation/serve/123
Для аналитических, оперативных, не отвечающих, нерепрезентативных, основанных на действиях заданий RPC работает лучше, и это вполне естественно думать функционально.
Пример реализации:
@route('/operation/cook/<orderId>')
def cook(orderId): doThis.
@route('/operation/serve/<orderId>')
def serve(orderId): doThat.
Пример платформы: Flask для python
Ответ 8
Через HTTP они оба становятся просто объектами HttpRequest
и ожидают возврата объекта HttpResponse
. Я думаю, что можно продолжать кодирование с этим описанием и беспокоиться о чем-то еще.