java - desde - Cómo generar un mensaje SOAP con una solicitud completa de WSDL sin código gen
soap web service java (5)
¿Qué pasa con la biblioteca 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));
}
}
}
Me gustaría preguntarle cómo puedo generar una solicitud / respuesta SOAP en un formato XML sobre la base del archivo WSDL. La plataforma de destino es JVM, por lo que se puede utilizar un amplio conjunto de idiomas (por ejemplo, Java, Scala, Groovy, JRuby, Jython, etc.). La generación de solicitud / respuesta SOAP se debe realizar únicamente en el nivel XML sin ninguna generación de clase y carga de clase (WSDL2Java, JAXB o enfoques similares son inapropiados en este caso). La generación debe hacerse mediante programación con el uso de componentes de código abierto. La técnica de generación debe admitir sabores de documento literal, rpc codificado y rpc literal, por lo que el generador debe manejar la codificación correcta de los parámetros. Los mensajes de solicitud / respuesta deben estar completamente llenos -> los nodos vacíos deben generarse incluso para valores vacíos / en blanco.
Acortando el cuento largo -> Me gustaría hacer programáticamente lo que se puede hacer en SoapUI IDE. Ya he echado un vistazo a diferentes bibliotecas / marcos relacionados con Java (SAAJ, WSDL4J) o Ruby (Savon), pero estoy luchando para seguir avanzando.
Un ejemplo de definición de servicio web (WSDL y XSD) en el que estoy trabajando es stockquote-ws.wsdl
y stockquote-schema.xsd
.
Lo que me gustaría hacer es:
SoapMessageGenerator generator = new SoapMessageGenerator("stockquote-ws.wsdl");
String request = generator.generateSoapRequest();
String response = generator.generateSoapResponse();
En este caso, una solicitud debería verse así:
<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>
... mientras que una respuesta debería verse así:
<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>
DE ACUERDO. Me las arreglé para resolver completamente este problema. He extraído algo de código de soapUI y comencé un proyecto de código abierto para admitir SOAP de forma puramente XML en Java. La razón principal detrás de la extracción de clase fue separar el código que es responsable de la generación de los mensajes SOAP del resto del código de las soapUIs que está estrechamente acoplado con otros módulos, como la interfaz gráfica de usuario de soapUIs, etc. proyectar aquí: https://github.com/reficio/soap-ws No solo es capaz de generar mensajes SOAP, sino que también proporciona un cliente y un servidor SOAP. Más detalles aquí: http://www.reficio.org/projects
En realidad estoy buscando hacer lo mismo. He estado usando la API javax.wsdl para extraer información de wsdl y estoy tratando de usar la API javax.xml.soap para crear la solicitud / respuesta SOAP. Puede que valga la pena echarle un vistazo.
Es posible que esté interesado en el proyecto kSOAP que se utiliza en el desarrollo móvil. El siguiente tutorial de kSOAP le indicará cómo serializar la solicitud y la siguiente sección le mostrará cómo obtener la respuesta.
kSOAP podría crear el mensaje SOAP sin tener que generar el código proxy. Esto es necesario en el desarrollo de dispositivos móviles debido a que su capacidad de procesamiento es considerablemente menor que la del escritorio y las clases y la biblioteca de proxy se consideran más pesadas que la creación directa del mensaje SOAP.
El artículo anterior parece abordar la técnica que intentaría para su caso: hacer uso de la transformación XSLT. Después de todo vas de XML a XML. Si tiene más suerte que yo al encontrar (o desarrollar, por supuesto) la (s) hoja (s) de estilos XSLT específica (s), necesita ir de un WSDL a una (s) solicitud (es) de SOAP adjuntas que me encantaría conocer al respecto.
Saludos, Wim