Обратная совместимость и веб-сервисы

Итак, я немного новичок в веб-сервисах, и недавно возникла ситуация, когда мы добавили элемент к типу данных, который возвращается клиенту. Клиенты жаловались, что это сломало их реализацию, потому что она задыхалась от нового элемента, которого не ожидала. (мы предоставляем услуги через Axis2).

Мне это кажется безобидным изменением, которое клиент должен уметь изящно обрабатывать (я работал с некоторыми платформами, не относящимися к веб-службам, где добавление дополнительной информации было вполне приемлемо). Я мог бы понять, если бы мы удалили или переименовали некоторые поля, которые вызвали бы проблемы у клиента.

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


person Jason Tholstrup    schedule 17.12.2009    source источник
comment
Я бы предположил, что, возможно, клиент подделывает его и не использует интерфейс SOAP и, возможно, анализирует ответ с помощью какого-то ужасного ручного синтаксического анализа / выдумки регулярных выражений (удивительно, как много людей делают это). Я говорю это, поскольку я регулярно создаю клиентские и серверные SOAP-интерфейсы на C#, PHP, Perl и JavaScript в системах Unix и Windows (для веб-приложений, на стороне сервера и в настольных клиентских приложениях) и никогда не сталкивался с этой проблемой (добавление необязательных полей в запросе или ответе ни разу не вызвало проблемы). Я бы спросил их, какой клиент SOAP они используют. :-)   -  person Iain Collins    schedule 09.02.2010


Ответы (4)


WSDL фактически действует как контракт, а не как интерфейс. WSDL точно описывает, что операция ожидает «получить» и что она ожидает «вернуть». Ближайшей аналогией этого было бы изменение прототипа функции в C без изменения самой функции, они не будут совпадать, и это вызывает проблемы.

Чем конкретнее WSDL, тем большее поведение вы «гарантируете».

Если вам нужна гибкость в возвращаемых данных (например, добавление/удаление полей и т. д.), вы можете сделать одно из следующих действий:

  1. Версируйте свои определения WSDL и публикуйте службы, которые могут перенаправлять старые версии на новые версии.
  2. Используйте более абстрактные типы возвращаемых данных, такие как XML, чтобы скрыть сложность или изменение данных.

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

person GrayWizardx    schedule 17.12.2009

В прошлом, имея дело с открытыми API-интерфейсами WebService, я всегда придерживался философии управления версиями по дате. К сожалению, вам приходится иметь дело с обратной совместимостью для любого API, который вы публикуете после выхода из «бета-режима» (а иногда и тогда).

То, что мы сделали, было очень просто; в день выпуска нового API мы создали такую ​​структуру папок:

http://mydomain.com/path/to/service/2009/12/17/servicename.svc

Таким образом, мы могли бы узнать, какая версия является последней, просто проверив структуру папок, и нашим клиентам не пришлось бы беспокоиться о нарушении изменений, пока они не будут готовы к обновлению. Работал как чемпион для нас; единственное, что я мог бы изменить, это использовать одну папку, чтобы их было легче просматривать вместе:

http://mydomain.com/path/to/service/2009-12-17/servicename.svc
person jvenema    schedule 17.12.2009
comment
Я делаю что-то очень похожее на это, за исключением того, что предпочитаю использовать явные номера версий (например, http://http://example.com/ServiceName/1.0/Service/ ) и изменять его, ТОЛЬКО если API изменяется несовместимым образом. - person Iain Collins; 09.02.2010

WSDL фактически является вашим опубликованным интерфейсом SOAP вашего веб-сервиса. Многие клиенты используют это для создания своих клиентских прокси, которые предоставляют все ваши методы веб-сервиса на выбранном ими языке программирования. Большинство таких клиентов, сгенерированных кодом, очень уязвимы и предпочтут генерировать исключение, если увидят элемент, который они не распознают (т. е. его нет в WSDL), а не проигнорируют его. Некоторые более расслаблены, и это действительно зависит от клиентской технологии, которую они используют, т. Е. Новые DataContract от Microsoft имеют интерфейс IExtensibleData на своих клиентах, чтобы специально хранить данные, которые они не распознают, поэтому они в значительной степени игнорируют неизвестные элементы.

Клиентские прокси-серверы SOAP и сгенерированные кодом поддаются такого рода проблемам, потому что они генерируют клиентов, которые хотят понять «всю схему», а не только интересующие их биты. Альтернативой для них является использование Xml Parser и просто вытягивание те биты, которые им нужны.

Если ваша веб-служба находится в стадии разработки или постоянно меняется, то SOAP действительно не лучший выбор, поскольку это будет означать, что при каждом изменении им придется заново генерировать, перестраивать и повторно развертывать своих клиентов службы. В зависимости от вашей ситуации вы можете вместо этого рассмотреть возможность предоставления веб-служб REST + POX (обычный старый Xml), поскольку их проще анализировать, поскольку они не имеют накладных расходов SOAP, могут вызываться через обычный URL-адрес и потребляются средами, которые у вас нет библиотеки SOAPClient (например, непосредственно в браузере с использованием AJAX)

person mythz    schedule 09.02.2010
comment
Я должен не согласиться с вышеизложенным, поскольку у меня никогда не было проблем с дополнительными элементами в запросе/ответе с использованием библиотек SOAPClient PHP, C# (Mono/.NET) или Perl SOAP или с JavaScript (отмечу, что есть по крайней мере один довольно хороший кроссбраузерный SOAP-клиент на JavaScript). Варианты REST для общедоступных интерфейсов являются ценными инструментами для таких вещей, как гибридные приложения, но SOAP является лучшим программным подходом для веб-сервисов. - person Iain Collins; 09.02.2010
comment
Лейн, если вы используете клиент SOAP, то вы не используете сгенерированный код WSDL, все, что вы делаете, - это используете интеллектуальный синтаксический анализатор Xml, чтобы пропустить заголовки SOAP, чтобы перейти к полезной нагрузке (конечно, вы не получите ошибки синтаксического анализатора с динамическим языком). Если это так, то в чем конкретно заключаются дополнительные накладные расходы и сложность веб-службы SOAP? - person mythz; 09.02.2010
comment
Ваша предпосылка неверна, поскольку клиенты SOAP используют сгенерированный код WSDL, они просто не склонны выдавать ошибки при наличии посторонних элементов. Практически все они так работают на практике. Это никоим образом не умаляет преимуществ использования SOAP, поскольку вся основная плита должна быть автоматизирована. Таким образом, я бы сказал, что его очень легко реализовать (если только вы не используете что-то ужасное и устаревшее, например, формат RPC/Encoded, из-за которого SOAP имеет плохую репутацию из-за сложности). - person Iain Collins; 12.02.2010
comment
Вы говорили о PHP (php.net/manual/en/book.soap. php), Perl (perl.com/pub/a /2001/01/soap.html) или клиенты JavaScript Soap, ни один из которых не использует сгенерированный код. Я провел большую часть своей карьеры, разрабатывая сгенерированные WSDL SOAP-клиенты (разработал веб-сервисы fx: servicestack.net). Я могу с уверенностью сказать, что любое существенное изменение (переименование элементов, измененное пространство имен, неожиданное упорядочение и т. д.) приводит к возникновению исключений сериализации. Вы не можете просто реорганизовать службу SOAP и ожидать, что существующие клиенты будут работать - это природа зверя. - person mythz; 12.02.2010
comment
Кстати, если вы используете автоматически сгенерированный код котла, то вам нужно повторно развернуть своих клиентов, это не тот случай, если вы анализируете Xml или используете Xpath для извлечения только тех частей, которые вам нужны. заинтересованы, и они не изменились - вот что я пытаюсь сделать. - person mythz; 12.02.2010
comment
На самом деле клиенты PHP, Perl и C# .NET/Mono наверняка используют WSDL для автоматической генерации кода интерфейса, и они не ломаются из-за того, что дополнительные элементы принимаются (но не передаются) веб-службе Doc/Lit (только Клиент JS не использует WSDL, потому что это хак). Процитирую, здесь обсуждаются посторонние элементы. Никто не поддерживает идею о том, что переименование элементов будет в порядке (хотя изменение порядка не должно вызывать никаких проблем в любой наполовину разумной реализации, и я очень сомневаюсь, что это происходит на практике, учитывая, что я знаю, что большинство клиентов игнорируют лишние элементы). - person Iain Collins; 12.02.2010

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

person YAVS    schedule 13.05.2014