Будет ли использование WSDL для генерации REST клиентов неправильным направлением? - PullRequest
3 голосов
/ 23 февраля 2010

Я собираюсь создать довольно простой веб-сервис для использования в интрасети. Сервис, в конечном счете, станет интерфейсом к БД, который позволит мне отслеживать, что делают различные внутренние инструменты в компании. Я думаю, что мне нужен веб-сервис, чтобы различные инструменты (и, следовательно, разные языки) в организации могли легко обновлять БД, не зная схемы.

Я уже прочитал многие из связанных вопросов REST vs SOAP, которые возникли при поиске https://stackoverflow.com/search?q=soap+rest, но я не уверен, что нашел свой ответ.

Моя дилемма состоит в том, что мне нужна простота REST, а также возможности WSDL для генерации кода, которые , по-видимому, подразумевают SOAP. Для меня крайне важно, чтобы различные внутренние инструменты (JAVA, Perl, Python, PHP, C ++) могли общаться с этим сервисом, и было бы глупо переписывать / поддерживать интерфейсный уровень для каждого из этих языков вручную, когда маршрут WSDL сделал бы это для меня. Из того, что я могу сказать, если WS нужно изменить, вы бы обновили WSDL, заново сгенерировали клиентские заглушки и внесли любые необходимые изменения в код, который использует заглушки (что нужно было бы сделать в любом случае).

Например - скажем, у меня есть инструмент, написанный на JAVA, который использует веб-сервис RESTful. Я предполагаю, что у инструмента будет специальный код для работы с определенными URL-адресами, запуска запроса, выполнения чего-либо с ответом, преобразования этого в некоторую структуру данных, если я хочу, и т. Д. Теперь допустим, что у меня также есть инструмент Perl, выполняющий то же самое. Теперь мне понадобится Perl-код, чтобы делать то же самое, делать запросы по определенным URL-адресам, получать ответы, что-то делать с ними и т. Д. В каждом случае, и, следовательно, в C ++ и Python и C #, где код не может быть передан, в конце концов Я получу классы / методы-обертки, которые скрывают от меня много этого уродства. Я бы предпочел вызвать функцию класса, которая возвращает мои данные, инкапсулированные в объекте, вместо того, чтобы беспокоиться об URL, аргументах, ответе и т. Д. Конечно, может быть, не так много кода в каком-то конкретном месте, но это начинает складываться со временем. Умножьте это на каждый инструмент, и теперь, когда я внесу изменения в сервис, я должен обновить URL-адреса в каждой операции CRUD и все, что с этим связано. Я предполагаю, что я представляю, что с WSDL это аспект, который сделан для вас. Ваш код просто взаимодействует с заглушками. Что делают заглушки, кого это волнует? URL, аргументы, ответы - если что-то изменится, просто создайте заглушки из WSDL. Если этот процесс приводит к поломке вашего кода, пусть будет так, но, по крайней мере, мне не пришлось обновлять весь код, связанный со спецификой создания запроса и работы с ответом. Разве это не проблема? Возможно, мне нужно просто создать службу и несколько клиентов и посмотреть, с чем я действительно столкнулся.

Хотя я довольно опытный программист с опытом работы с JAVA, Perl, Python, C ++ и т. Д., Я впервые подумал о создании WS и не имею опыта работы с другими WS, поэтому я ' ищу какое-то руководство. Мне просто пойти с WSDL / SOAP и забыть о том, что все говорят о том, насколько популярен, прост и полезен REST?

Ответы [ 5 ]

5 голосов
/ 23 февраля 2010

У меня здесь нет проблемы с генерацией кода.

REST редко требует какой-либо генерации кода. Это просто HTTP-запросы с простыми полезными нагрузками JSON (или XML).

Вы используете существующие библиотеки HTTP (например, Apache Commons или Python urrlib2). Вы используете существующие библиотеки JSON (или XML). (например, проект Джерси имеет хорошее преобразование JAXB-JSON).

Что "генерируется"? Наша библиотека RESTful на Java и Python практически идентична и просто делает запросы REST через библиотеку HTTP.

class OurService {
    def getAResource( String argValue ) {
        path = { "fixed", argValue };
        URI uri= build_path( path );
        return connection.get( uri )

[Я исключил обработку исключений.]

Вы пытаетесь наложить слой на сложное разделение интерфейса / реализации SOAP?


Клиент "написанный на JAVA, использующий веб-сервис RESTful" ... "Инструмент Perl, выполняющий ту же самую работу" ... "в C ++, Python и C #".

Correct.

"где код не может быть передан"

Правильно. Код не может быть передан. Вы должны написать каждому клиенту на соответствующем языке. Написание своего рода «генератора» для создания этого кода из WSDL - это (1) огромный объем работы и (2) ненужная. Каждый язык имеет уникальный синтаксис и уникальные библиотеки для выполнения запросов REST. Но он настолько прост и универсален, что там почти ничего нет.

Канонический пример в Python:

class Some_REST_Stub( object ):
    def get_some_resource( self, arg ): # This name is from the WSDL
        uri = "http://host:port/path/to/resource/%s/" % arg # This path is from the WSDL
        data= urllib2.open( uri )
        return json.load( data )

Этот блок кода на короче , чем WSDL, необходимый для его описания. И кажется, что это легче изменить, потому что имя - это имя метода, а URI - просто строка.

В большинстве языков клиент примерно такой простой. Я только что написал кучу клиентского кода REST на Java. Это более многословно, но это общий материал. Создайте запрос, проанализируйте JSON, который возвращается. Вот и все.

Объявление RESTful WSDL скрывает две части тривиальной информации в большом количестве XML.

  • Предоставляет «имя интерфейса» для URI.

  • Он документирует значение GET, PUT, POST и DELETE, предоставляя имена методов класса-заглушки.

Это не поможет вам написать много кода, так как не так много кода. Обратите внимание, что все запросы REST имеют одинаковую общую структуру HttpRequest и HttpResponse. Запрос содержит общие сущности. Ответ также содержит универсальный объект, который необходимо проанализировать. Там очень мало для отдыха - суть в том, чтобы быть максимально простым.

Это в значительной степени устраняет необходимость в WSDL, поскольку все является универсальным JSONObject или XML URLE, закодированным и отправленным в виде строки.

«Я бы скорее вызвал функцию класса, которая возвращает мои данные, инкапсулированные в объект, вместо того, чтобы беспокоиться об URL, аргументах, ответе и т. Д.»

Правильно, вам нужно написать класс-заглушку. У него почти нет кода, и он будет короче, чем требуется WSDL для его описания.

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

Вы можете обновить класс заглушки на каждом языке для каждого клиента. Или вы можете обновить WSDL и затем заново создать каждого клиента. Это похоже на тот же объем работы, поскольку URI тривиально инкапсулируется в клиентском коде.

«Думаю, я представляю, что с WSDL это тот аспект, который сделан для вас».

Мне неясно, что "сделано". Переводить многословный и сложный WSDL в простой класс заглушки? Я полагаю, это может быть полезно. За исключением того, что WSDL больше, чем класс заглушки. Я предполагаю, что вам, вероятно, будет проще написать класс-заглушку. Это короче, чем WSDL.

«Ваш код просто взаимодействует с заглушками».

Правильно.

"Что делают заглушки, кого это волнует? URL, аргументы, ответы - если что-то изменится, просто создайте заглушки из WSDL."

К сожалению, почти ничего из этого не требует реального программирования. Генерировать его из WSDL - больше работы, чем просто писать. URI это строки. Аргументы являются общими JSONObjects. Ответы являются общими HttpResponses, включая JSONArray. Вот и все.

«Мне также не пришлось обновлять весь код, касающийся специфики создания запроса и обработки ответа.»

За исключением каких-либо интересных особенностей создания запроса. HTTP простой, общий материал. GET, POST, PUT и DELETE - все почти идентичны.

1 голос
/ 12 января 2011

Apache CXF имеет поддержку Java для клиентов REST, которая во многих случаях дает те же преимущества «генерации кода», что и полный SOAP.

1 голос
/ 23 февраля 2010

FYI - REST имеет WSDL-подобное определение схемы автоматического генерирования, которое называется WADL . Но почти никто не использует это.

1 голос
/ 23 февраля 2010

Аспект создания кода, который вы цените, является элементом обслуживания, но я ставлю под сомнение его реальную ценность.

Будь то документ WSDL или ваша собственная грамматическая документация для реализаций в стиле REST, клиенты должны соответствовать опубликованному интерфейсу. Модель разработки WS / SOAP (генерация кода) может иметь больше инструментов, но я думаю, что это потому, что она неуклюжа и нуждается в них.

Нет никакого влияния на «интегрируемость» вашего веб-сервиса. Это проблема публикации формального интерфейса (в любой форме), в любом случае. А скорость, с которой вы переходите от смены интерфейса к смене реализации, возможно, быстрее с сервисами в стиле REST. Для запуска (и борьбы с) инструментов генерации кода WS- * требуется время.

1 голос
/ 23 февраля 2010

Fossill,

Я не рекомендую вам изучать SOAP для этого.У Ws- * очень высокая кривая обучения, и (ненужная) сложность, вероятно, съест вас живьем.

Глядя на свой набор навыков (Java, Perl, Python, C ++), вы должны быть очень довольны RESTили хотя бы на основе HTTP) подхода.И: вы получите результаты очень быстро.

Как сказал С. Лотт, не беспокойтесь о генерации кода.Вам это не понадобится.

По вопросам, я предлагаю вам присоединиться к rest-обсуждениям в группах Yahoo: http://tech.groups.yahoo.com/group/rest-discuss/ Обычно вы получаете немедленную помощь по всем вопросам, связанным с REST.

Лично я еще не видел ни одного варианта использования, который мог бы выиграть от использования WS - *.

Jan

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