Как сгенерировать SOAP-сообщение с полностью заполненным запросом из WSDL без кода gen - PullRequest
20 голосов
/ 20 сентября 2011

Я хотел бы спросить вас, как я могу сгенерировать запрос / ответ SOAP в формате XML на основе файла WSDL. Целевой платформой является JVM, поэтому можно использовать широкий набор языков (например, Java, Scala, Groovy, JRuby, Jython и т. Д.). Генерация запросов / ответов SOAP должна выполняться исключительно на уровне XML без генерации классов и загрузки классов (WSDL2Java, JAXB или подобные подходы в этом случае неуместны). Генерация должна быть выполнена программно с использованием компонентов с открытым исходным кодом. Техника генерации должна поддерживать документ-литеральные, rpc-кодированные и rpc-литеральные разновидности, поэтому генератор должен обрабатывать правильное кодирование параметров. Сообщения запроса / ответа должны быть полностью заполнены -> пустые узлы должны генерироваться даже для пустых / пустых значений.

Короче говоря, длинная история -> Я хотел бы программно сделать то, что выполнимо в SoapUI IDE. Я уже рассматривал различные библиотеки / фреймворки, связанные с Java (SAAJ, WSDL4J) или Ruby (Savon), но я изо всех сил стараюсь продвинуть его дальше.

Пример определения веб-службы (WSDL и XSD), над которым я работаю: stockquote-ws.wsdl и stockquote-schema.xsd.

Я хотел бы сделать следующее:

SoapMessageGenerator generator = new SoapMessageGenerator("stockquote-ws.wsdl");
String request = generator.generateSoapRequest();
String response = generator.generateSoapResponse();

В этом случае запрос должен выглядеть следующим образом:

<soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:stoc="http://centeractive.com/stockquote.wsdl" xmlns:stoc1="http://centeractive.com/stockquote.xsd">
   <soapenv:Header/>
   <soapenv:Body>
      <stoc:GetLastTradePrice soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
         <stoc1:TradePriceRequest>
            <tickerSymbol xsi:type="xsd:string">?</tickerSymbol>
         </stoc1:TradePriceRequest>
      </stoc:GetLastTradePrice>
   </soapenv:Body>
</soapenv:Envelope>

... тогда как ответ должен выглядеть следующим образом:

<soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:stoc="http://centeractive.com/stockquote.wsdl" xmlns:stoc1="http://centeractive.com/stockquote.xsd">
   <soapenv:Header/>
   <soapenv:Body>
      <stoc:GetLastTradePriceResponse soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
         <stoc1:TradePrice>
            <price xsi:type="xsd:float">?</price>
         </stoc1:TradePrice>
      </stoc:GetLastTradePriceResponse>
   </soapenv:Body>
</soapenv:Envelope>

Ответы [ 5 ]

18 голосов
/ 31 июля 2012

OK.Мне удалось полностью решить эту проблему.Я извлек некоторый код из soapUI и начал проект с открытым исходным кодом для поддержки SOAP исключительно на XML в Java.Основной причиной извлечения класса было отделение кода, отвечающего за генерацию сообщений SOAP, от остальной части кода soapUI, который тесно связан с другими модулями, такими как графический пользовательский интерфейс soapUI и т. Д. Вы можете найтиПроект здесь: https://github.com/reficio/soap-ws Он не только способен генерировать SOAP-сообщения, но также предоставляет SOAP-клиент и сервер.Подробнее здесь: http://www.reficio.org/projects

6 голосов
/ 01 марта 2012

А как насчет библиотеки SOAPUI:

package com.bbog.soap;

import com.eviware.soapui.impl.wsdl.WsdlInterface;
import com.eviware.soapui.impl.wsdl.WsdlOperation;
import com.eviware.soapui.impl.wsdl.WsdlProject;
import com.eviware.soapui.impl.wsdl.support.wsdl.WsdlImporter;
import com.eviware.soapui.model.iface.Operation;

public class WsdlAnalyzer {

    public static void main(String[] args) throws Exception {
        WsdlProject project = new WsdlProject();
        WsdlInterface[] wsdls = WsdlImporter.importWsdl(project, "http://localhost:7000/Solicitud?wsdl");
        WsdlInterface wsdl = wsdls[0];
        for (Operation operation : wsdl.getOperationList()) {
            WsdlOperation op = (WsdlOperation) operation;
            System.out.println("OP:"+op.getName());
            System.out.println(op.createRequest(true));
            System.out.println("Response:");
            System.out.println(op.createResponse(true));
        }
    }
}
0 голосов
/ 13 июня 2012

Я действительно хочу сделать то же самое.Я использовал API javax.wsdl для извлечения информации из wsdl и пытаюсь использовать API javax.xml.soap для создания запроса / ответа SOAP.На них, возможно, стоит взглянуть.

0 голосов
/ 21 сентября 2011

статья IBM

Похоже, что в приведенной выше статье рассматривается методика, которую я бы попробовал для вашего случая: использовать XSLT-преобразование. В конце концов, вы переходите от XML к XML. Если вам повезет больше, чем я нашел (или разрабатываю) конкретные таблицы стилей XSLT, из которых вам нужно перейти от WSDL к сопровождающему запросу (ям) SOAP, я бы хотел узнать об этом.

Ура, Wim

0 голосов
/ 20 сентября 2011

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

kSOAP может создать сообщение SOAP без необходимости генерации прокси-кода.Это необходимо при разработке мобильных приложений, поскольку его вычислительная мощность значительно меньше, чем у настольных компьютеров, а наличие прокси-классов и библиотеки считается более тяжелым, чем непосредственное создание сообщения SOAP

...