Преобразуйте WSDL в соответствующие HTTP-привязки - PullRequest
5 голосов
/ 25 января 2012

Я просто пытаюсь преобразовать WSDl во множество различных HTTP-запросов из данных, предоставленных WSDL.Я прочитал тонну подобных вопросов, но ни один из них не дал ответа.

Некоторые говорят, что используют SOAPUI - я знаком с этим приложением и использую его.Но мне нужно создать эти HTTP-запросы от WSDL самостоятельно.

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

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

Любые предложения будут очень полезны.Цель состоит в том, чтобы я хотел иметь возможность использовать WSDL, исследовать его и создавать запросы HTTP-SOAP для каждого метода в WSDL, а также проверять их на наличие проблем безопасности.Первый шаг - создать эти запросы!

1 Ответ

2 голосов
/ 30 января 2012

При вызове веб-службы SOAP вы можете использовать статический или динамический вызов.

Статический вызов означает создание заглушки из WSDL и использование ее для выполнения вызова. Это создает весь «слесарный» код для вас, но тесно связан только с этим веб-сервисом, и вы не можете использовать его для других веб-сервисов с другими контрактами. Для каждого WSDL вам нужно создать еще одну заглушку.

При динамическом вызове вы читаете WSDL во время выполнения и выясняете, как вызывать веб-сервис, основываясь на информации, которую вы получаете из WSDL. Подайте ему несколько WSDL, и клиент адаптируется.

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

Он читает WSDL, который вы передаете, извлекает схему XML из раздела типов и генерирует экземпляры XML. Для этого он использует Wsdl4j и XmlBeans под капотом.

Ваше решение использовать Wsdl4j хорошее, поскольку оно дает вам контроль при разборе WSDL. Но также взгляните на XmlBeans; у него есть другие инструменты , которые могут оказаться полезными, например, схема для экземпляра класса .

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

import com.eviware.soapui.impl.wsdl.WsdlInterface;
import com.eviware.soapui.impl.wsdl.WsdlProject;
import com.eviware.soapui.impl.wsdl.support.wsdl.WsdlImporter;

public class Test {
    public static void main(String[] args) throws Exception {
        WsdlProject project = new WsdlProject();
        WsdlInterface[] wsdls = WsdlImporter.importWsdl(project, "http://www.html2xml.nl/Services/Calculator/Version1/Calculator.asmx?wsdl");
        WsdlInterface wsdl = wsdls[0];
        System.out.println(wsdl.getOperationByName("Add").createRequest(true));
        System.exit(0); // just to clear up some threads created by the project 
    }
}

Сообщение, которое вы должны увидеть напечатанным (для операции Add в Calculator WS), будет выглядеть примерно так:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/">
   <soapenv:Header/>
   <soapenv:Body>
      <tem:Add>
         <tem:a>?</tem:a>
         <tem:b>?</tem:b>
      </tem:Add>
   </soapenv:Body>
</soapenv:Envelope>

Надеюсь, это поможет вам выйти за пределы первого шага.

...