Инструмент сравнения XML / WSDL - PullRequest
14 голосов
/ 09 ноября 2011

Для тех, кто много работает с веб-сервисами, нет ничего удивительного в том, что они время от времени обновляются. И вам всегда нужно отслеживать изменения этих обновлений.

В моем конкретном случае я имею дело с веб-сервисом, определенным WSDL, и получаю классы, сгенерированные на основе этого WSDL.

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

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

Я пробовал использовать Oxygen XML Diff, но он также не работает для меня.

Я ищу инструмент, который возьмет два XML и принесет мне только семантические различия, например ::

  • Добавлен элемент A
  • Добавлен подэлемент b7 к элементу B

Для того, чтобы это работало, я думаю, что инструмент должен загружать и глубоко анализировать структуру, было заявлено, что Oxygen XML Diff делает это хорошо, но это просто улучшенная версия сравнения текстовых файлов.

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

ОБНОВЛЕНИЕ 1 : Новая идея - сравнивать сгенерированные источники, а не WSDL.

Спасибо.

Ответы [ 3 ]

14 голосов
/ 09 ноября 2011

http://membrane -soa.org имеет Java API для сравнения WSDL в их модели SOA .

package sample.wsdl;

import java.util.List;
import com.predic8.wsdl.*;
import com.predic8.wsdl.diff.WsdlDiffGenerator;
import com.predic8.soamodel.Difference;

public class CompareWSDL {

  public static void main(String[] args) {
    compare();
  }

  private static void compare(){
    WSDLParser parser = new WSDLParser();

    Definitions wsdl1 = parser.parse("resources/diff/1/article.wsdl");

    Definitions wsdl2 = parser.parse("resources/diff/2/article.wsdl");

    WsdlDiffGenerator diffGen = new WsdlDiffGenerator(wsdl1, wsdl2);
    List<Difference> lst = diffGen.compare();
    for (Difference diff : lst) {
      dumpDiff(diff, "");
    }
  }

  private static void dumpDiff(Difference diff, String level) {
    System.out.println(level + diff.getDescription());
    for (Difference localDiff : diff.getDiffs()){
      dumpDiff(localDiff, level + "  ");
    }
  }
}

После выполнения вы получите вывод, показанный в листинге 2. Это список различий между двумя документами WSDL.

Port ArticleServicePTPort removed.
Port ArticleServicePTPort2 added.
Operation create removed.
Operation create2 added.
Schema http://predic8.com/wsdl/material/ArticleService/1/ has changed:
  Element createResponse has changed:
    ComplexType  has changed:
      Sequence has changed:
        Element NewElementForTest added.

В качестве примера вывода из инструмента: http://www.service -repository.com / предлагает онлайновый инструмент WSDL Comparator , который возвращает отчет о различиях между двумя WSDL.Отчет не является простой разницей XML.

6 голосов
/ 15 марта 2018

Поднятый вопрос на самом деле очень распространен для любой системы, построенной на основе SOA.Обычно у вас есть несколько потребителей WSDL или несколько служб, использующих тот же WSDL, и теперь WSDL необходимо обновить.

  • Нужно ли обновлять все клиенты и сервер одновременно (это дорого!)
  • Если мы выполняем поэтапное развертывание, на какие операции в WSDL влияют (не работают)) если обновленный клиент вызывает необновленную службу?
  • И наоборот, могут ли некоторые клиенты быть обновлены позже?
  • Как изменяется структура XML?Могут ли эти изменения допускаться некоторыми парсерами (например, некоторые парсеры не ломаются, если они находят новый элемент в конце последовательности, но ломаются, если он находится в середине).

И нет, ни diff для WSDL, ни diff для сгенерированного XML не могут надежно помочь.

В дополнение к изменениям схемы WSDL может изменить структуру структурированной полезной нагрузки (тело / заголовок), кодирование / квалификацию, действие SOAPсвойства привязки - любое из которых может привести к потере совместимости.

Чтобы сделать вещи еще более хитрыми, некоторые типы изменений, внесенных во входные данные, нарушают сценарий «обновлен до старого», тогда как в выходных данных они должны бытьсчитается неразрушающим.Например, новый необязательный элемент в запросе сломал бы старый сервис, если он будет пройден, но тот же элемент в ответе не будет сгенерирован старым сервисом (потому что он не знает об этом), и отсутствие элемента будет допущенообновленный клиент, поскольку элемент является необязательным.

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

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

Так что после нескольких лет боли мне пришлось написать собственный код, который отвечаетПриведенные выше вопросы я могу напрямую предоставить нашим BA / PM в качестве подтверждающей документации для оценки воздействия.

См. здесь: https://wsdldiff.mockmotor.com/

  1. Загрузите ваш WSDL и схемы:

Upload WSDLs

Служба предоставит вам сводку воздействия: нарушаются ли изменения и какой сценарий развертывания будет затронут:

Upload WSDLs

Каждая операция помечается как имеющая разрывное или неразрывное изменение как портов, так и привязок:

Upload WSDLs

Вы можете взглянуть на детали критического изменения (то есть, какое изменение схемы / wsdl вызывает это).Вот, например, обязательный элемент был добавлен в середину последовательности:

Upload WSDLs

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

3 голосов
/ 09 ноября 2011

Это может быть только частичное решение, но вы можете проанализировать старый и новый WSDL в SOAPui .

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

надеюсь, что это поможет

...