Подтвердить что ты не робот

Как создать SOAP-сообщение с полностью заполненным запросом WSDL без кода gen

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

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

Здесь представлено примерное определение Web-сервиса (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>

Большое спасибо за любые подсказки!

4b9b3361

Ответ 1

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

Ответ 2

Как насчет библиотеки 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));
        }
    }
}

Ответ 3

Я нашел, что следующий webapp очень полезен для генерации выборочных SOAP-сообщений из заданного WSDL

http://www.soapclient.com/soapmsg.html

Ответ 4

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

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

Ответ 5

статья IBM

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

Cheers, Wim

Ответ 6

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