Как создать 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>
Большое спасибо за любые подсказки!
Ответы
Ответ 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. Возможно, стоит взглянуть на них.