Ответ 1
Введение
Я отправляю это как ответ, потому что комментариев просто не хватает. Вот что я хочу обобщить для вас.
Сначала мы начнем с этих двух ссылок:
http://spf13.com/post/soap-vs-rest
http://blog.smartbear.com/apis/understanding-soap-and-rest-basics/
Наконец, я хочу начать этот пост, сказав следующее:
SOAP и REST были разработаны для решения следующей проблемы: как два разных приложения, программы или устройства обмениваются и обмениваются данными друг с другом в расширяемом и легко понятным способом?
Услуги RESTful
По дизайну RESTful ( Re презентация S tate T ransfer) службы используют HTTP
, а HTTP
глаголы (GET
, POST
, PUT
, DELETE
), чтобы указать намерение. Эти глаголы очень четко указывают пользователю, что произойдет, когда они будут использоваться. Сервер может использовать их для принятия превентивных решений. То есть, он может принять решение задолго до того, как действие будет готово.
Учтите это, вам нужно получить доступ к небольшому количеству данных из учетной записи Вставить службу. Что проще, запрос GET endpoint/users/account/id
или запрос POST endpoint/users/account
, который имеет тело id
? По определению REST запрос POST
нарушает основное соглашение, которое подразумевает REST. То есть: ожидается, что сервер узнает, прежде чем данные прибудут, какие намерения у него есть у пользователя. Это основная основа, которую пытается гарантировать REST.
Этот факт, нет, этот фундаментальный, требует, чтобы сообщение RESTful позволяло указать, какое намерение имеет клиент, прежде чем клиент начнет отправлять данные. Это позволяет серверу принимать и отклонять сообщения задолго до их прибытия, тем самым уменьшая нагрузку на обработку.
Другой аспект REST (особенно с Twitter, Facebook и Google): Службы RESTful, с фокусом и мандатом на HTTP
, могут воспользоваться заголовками ответов HTTP
. То есть, они могут отвечать сообщением HTTP 403 Forbidden
, если клиенту не разрешен доступ. службы SOAP не могут. В результате сообщение должно указать такой результат.
службы RESTful имеют тенденцию связывать HTTP verbs
(или действия) с существительными (или объектами/объектами). Вообще говоря, множественность и сингулярность подразумевают больше действий. То есть Ожидается, что GET RootEndpoint/Employees
вернет сотрудников all (или, по крайней мере, большая группа, соответствующая конкретным критериям). В то время как GET RootEndpoint/Employee/12
ожидается возврат только одного сотрудника. (Как правило, Сотрудник с ID 12.)
службы RESTful обеспечивают прямую корреляцию между HTTP verb
(GET
, POST
, PUT
, DELETE
) и действием. Это цель связи между ними: нет ничего особенного, которое необходимо добавить в тело сообщения, чтобы указать, что пользователь намеревается сделать. (Я буду продолжать подчеркивать этот момент.)
REST был полностью разработан для HTTP
. И это очень хорошо работает.
Фильтрация RESTful
Вообще говоря, чтобы отфильтровать запросы REST
службы, вы должны включить несколько сегментов URL с каждым отрезком, указывая, какой параметр следует за ним.
Я приведу пример из Spotify API: https://developer.spotify.com/web-api/get-playlist/
:
Получить список воспроизведения
Получить плейлист, принадлежащий пользователю Spotify.
Конечная точка
GET https://api.spotify.com/v1/users/{user_id}/playlists/{playlist_id}
Параметры запроса
+---------------------------------------------------+ | Path parameter | Value | +---------------------------------------------------+ | user_id | The user Spotify user ID. | | playlist_id | The Spotify ID for the playlist. | +---------------------------------------------------+
В этой конечной точке API вы указываете, что вы ищете объект users
с user_id
объекта {user_id}
и playlists
(внутри этого объекта users
) с помощью playlist_id
of HTTP
T232 > .
Некоторые службы RESTful позволяют сочетать флаги с параметрами.
Возьмите, например, API-интерфейс стека. Вы можете получить несколько вопросов или ответов, разделив их точкой с запятой и, по сути, отфильтруйте только те вопросы или ответы.
Если мы проанализируем эту конечную точку (/questions/{ids}/answers), вы увидите, что она указывает:
Получает ответы на набор вопросов, идентифицированных в id.
Этот метод наиболее полезен, если у вас есть набор интересных вопросов, и вы хотите получить все свои ответы сразу или если вы проводите опрос для новых или обновлений ответов (в сочетании с sort = activity).
{ids}
может содержать до 100 идентификаторов с разделителями с запятой, чтобы найти идентификаторы программным образом для поискаquestion_id
объектов вопроса.Виды, принятые этим методом, работают в следующих полях объекта ответа:
Это также хороший пример API, который позволяет дополнительным запросам GET
фильтровать/сортировать результаты еще дальше.
Пример использования: https://api.stackexchange.com/2.2/questions/30581530/answers?order=desc&sort=activity&site=stackoverflow
Теперь, если мы сделаем то же самое с /answers/{ids} конечной точкой, мы можем придумать что-то вроде строк: https://api.stackexchange.com/2.2/answers/30582379;30581997;30581789;30581628?order=desc&sort=activity&site=stackoverflow
. Это набирает четыре указанных ответа для нас.
Мы можем объединить еще больше, например, с SE API и включить фильтры для ограничения возвращаемых полей: https://api.stackexchange.com/2.2/questions/30581530/answers?order=desc&sort=activity&site=stackoverflow&filter=!)V)P2Uyugvm
. (См. эту ссылку в /2.2/filters для объяснения этого параметра filter
.)
Службы на основе SOAP
Введите SOAP ( S imple O bject A ccess P rotocol), который был предшественником REST. SOAP решил эту проблему, отправив сообщения туда и обратно. Они используют XML
(хотя вы можете создать SOAP-основанную службу без него, аналогично возможности создания RESTful службы без JSON
) для обмена сообщениями, при этом у сервера нет начального указания на то, что делать.
Службы на основе SOAP решают эту проблему таким образом, который является агностиком транспортной среды. Сервер и клиент не должны использовать HTTP
или даже TCP
вообще. Им просто нужно использовать одни и те же или совместимые транспортные среды. Фактически, вы могли бы думать о современной корпоративной среде как о SOAP-основе. Когда вам нужно получать новые материалы, вы отправляете заявку своему офис-менеджеру, который затем отвечает сообщением. Получив первоначальную заявку, ваш менеджер понятия не имеет, разрешено или нет. Они должны прочитать остальную часть заявки, чтобы определить, является ли она действительным запросом или недействительна.
SOAP был спроектирован вокруг RPCs
(вызовы с удаленной процедурой), многие брандмауэры блокируют их. Таким образом, SOAP был изменен для работы над HTTP
. Он был разработан для интеграции самых разных технологий.
Поскольку SOAP предназначен для сообщений, это гораздо более подробный сервис. Обычно проще представлять составные действия в службах SOAP. То есть, если вы запрашиваете objects
на основе критериев many (вместо одного) SOAP имеет лучший интерфейс для этого.
Фильтрация на основе SOAP
Фильтр служб на основе SOAP с дополнительными полями в RPC. Комбинация этих полей зависит от поставщика.
Я возьму пример из Глобального API погоды: http://www.webservicex.net/globalweather.asmx?op=GetWeather:
GetWeather
Получить прогноз погоды для всех крупных городов мира.
Test
Чтобы протестировать операцию с использованием протокола HTTP POST, нажмите кнопку "Вызов".
+---------------------------------------------------+ | Parameter | Value | +---------------------------------------------------+ | CityName: | | | CountryName: | | +---------------------------------------------------+
Если вы укажете, например, "Blanding" и "United States", вы увидите, что сгенерированный XML выглядит следующим образом:
<?xml version="1.0" encoding="utf-8"?> <soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope"> <soap12:Body> <GetWeather xmlns="http://www.webserviceX.NET"> <CityName>Blanding</CityName> <CountryName>United States</CountryName> </GetWeather> </soap12:Body> </soap12:Envelope>
Это будет отправлено (для HTTP-запроса SOAP) в качестве запроса на основе POST для http://www.webservicex.net/globalweather.asmx/GetWeather
.
Вернуться к исходному вопросу:
Может ли веб-служба на основе SOAP быть RESTful?
Это был ваш первоначальный вопрос, и я считаю, что разумно, что он не может, основываясь на информации, которую я предоставил. Эти две службы являются взаимоисключающими. REST намерен решить проблему с обменом headers
, указывающим на намерение, и message bodies
, которые указывают цель. SOAP намерен решить проблему с обменом messages
, который указывает намерение и цель.
Будет ли нарушение архитектуры REST использовать HTTP POST для получения данных из ресурса? Да. Архитектура службы RESTful предназначена для использования термина POST
для представления конкретного действия. Каждый HTTP verb
в REST представляет то, что намеревается сделать это действие.
Как я уже сказал в комментариях по первому вопросу:
Вы можете использовать
HTTP POST
для получения данных, но это не служба RESTful, аHTTP verb
не имеет значения. RESTful - RESTful, потому что глагол указывает на действие.
Что мне выбрать, SOAP или REST?
Эта часть существует прежде всего для будущих читателей.
Оба протокола имеют преимущества и недостатки, и вы должны выбрать, какой протокол вы используете, исходя из требований проблемы. Поручить вам, как это сделать, выходит за рамки этого вопроса и ответа. Тем не менее, есть три вещи, которые нужно учитывать: знать свой проект, знать свои требования и, самое главное, правильно документировать его для своей аудитории.