Я хотел бы спросить, как я могу генерировать SOAP-запрос/ответ в формате XML на основе WSDL-файла. Целевой платформой является JVM, поэтому можно использовать широкий набор языков (например, Java, Scala, Groovy, JRuby, Jython и т.д.). Генерация SOAP-запросов/ответов должна осуществляться исключительно на уровне XML без какой-либо генерации классов и загрузки классов (WSDL2Java, JAXB или подобные подходы в данном случае неуместны). Генерация должна осуществляться программно с использованием компонентов с открытым исходным кодом. Техника генерации должна поддерживать документально-литературный, rpc-кодированный и rpc-литературный вкусы, поэтому правильное кодирование параметров должно обрабатываться генератором. Запросы/ответные сообщения должны быть полностью заполнены -> пустые узлы должны быть сгенерированы даже для пустых/пустых значений.
Вырезая длинный рассказ -> я хотел бы сделать программно то, что можно сделать в SoapUI IDE. Я уже рассматривал различные Java-библиотеки/фреймворки (SAAJ, WSDL4J) или Ruby (Savon), но с трудом продвигаюсь дальше.
Образец определения Web-Service (WSDL и XSD), над которым я работаю.
stockquote-ws.wsdl
and 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>