Я хотел бы спросить вас, как я могу сгенерировать запрос / ответ 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>