Каков лучший подход к веб-сервисам - последний контракт или контракт?

Какой лучший подход к разработке веб-сервисов; контракт первый или контракт последний?
Каковы преимущества и недостатки каждого?

С какими у вас есть опыт?

ИЗМЕНИТЬ Этот вопрос касается внедрения веб-службы (читайте: SOAP) Вопрос заключается в том, должны ли сначала быть закодированы классы реализации, а сгенерированы схемы WSDL и XSD из этого (контракт последним) или схемы WSDL и XSD, и генерируемых классов реализации (контракт сначала)

Ответ 1

Контракт - это, как правило, общепринятая "лучшая практика".

Это делает вас очень ясным как с производителем, так и с потребителем услуги, в точности, что необходимо и что ожидается. Это становится особенно важным, когда вы начинаете пытаться преобразовать типы java → xml. Вы также можете повторно использовать схемы в разных веб-службах.

Ответ 2

Я использовал оба подхода. Мое предложение состоит в том, чтобы использовать контракт сначала, но первый код WSDL.

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

@WebService
public ...

По крайней мере, вы можете проверить свое развертывание.

Для схемы я предложил контракт сначала, потому что язык XML-схемы намного богаче того, что вы можете описать на Java. Пример, который я обычно даю, показывает, что XML Schema может ограничивать размер строки и применять шаблон регулярного выражения. Выполнение этого в Java и аннотации выглядит немного беспорядочным.

Еще одно преимущество выполнения схемы в качестве контракта - наличие инструментов для преобразования вашего файла схемы в документацию HTML.

Инструмент XJC может генерировать требуемые файлы классов. Тем не менее, я бы рекомендовал сделать это в начале.

В конце вы должны взять сгенерированный файл WSDL и работать с ним. Таким образом вы можете использовать wsimport и убедиться, что все это из WSDL в Schema действительно.

Вы можете развернуть файл WSDL с помощью атрибута wsdlLocation в реализации @WebService, и сервер приложений исправит данные привязки для вас, когда пользователи запрашивают WSDL с сервера, но вы все равно сохраняете свои аннотации. В противном случае ваши аннотации не будут отображаться в запрошенных файлах WSDL.

Ответ 3

Я подозреваю, что ответ определенно "это зависит".

Проблема заключается в том, что если вы строите и публикуете свой контракт, вы обязаны этим заниматься. Это усложняет смену. не невозможно, но сложнее.

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

Не существуют ли также инструменты, которые будут генерировать скелет кода из WSDL? Я почти уверен, что есть. Если это так, вам может потребоваться сделать код "кодом" и сгенерировать код из него.