Hi,
ich versuche eine Lösung zu finden, um einen SOAP-Request komplett per Hand ohne WSDL-Datei zu erzeugen. Grund ist, dass wsdl2java zwar anhand der WSDL-Datei Stubs erzeugen kann, jedoch ist der Code fehlerhaft/unvollständig. Ergibnisse von 2 der 3 möglichen Procedures sind nicht vollständig.
Daher will ich den Code per Hand erzeugen. Bisher geht dies auch ganz gut:
<snip: JAVA CODE MIT APACHE AXIS 1>
String endpoint =
"http://**hidden**";
Service webservice = new Service();
Call webserviceCall = (Call) webservice.createCall();
webserviceCall.setTargetEndpointAddress( new java.net.URL(endpoint) );
webserviceCall.setOperationName(new QName(null, "IPS_SubServiceCall"));
webserviceCall.setEncodingStyle( "http://schemas.xmlsoap.org/soap/encoding/" );
webserviceCall.setOperationStyle("rpc");
webserviceCall.addParameter("SID", org.apache.axis.Constants.XSD_STRING, javax.xml.rpc.ParameterMode.IN);
webserviceCall.addParameter("SERVICE", org.apache.axis.Constants.XSD_STRING, javax.xml.rpc.ParameterMode.IN);
webserviceCall.addParameter("SUBSERVICE", org.apache.axis.Constants.XSD_STRING, javax.xml.rpc.ParameterMode.IN);
// THAT's WRONG:
webserviceCall.addParameter("REQUESTMAP", org.apache.axis.Constants.XSD_STRING, javax.xml.rpc.ParameterMode.IN);
webserviceCall.setReturnType(org.apache.axis.Constants.XSD_STRING);
Object o = (Object) webserviceCall.invoke( new Object[] {sessionID, service, subservice, "requestmap"} );
MessageContext mc = webserviceCall.getMessageContext();
String response = mc.getResponseMessage().getSOAPPartAsString();
StringReader strReader = new StringReader(response);
InputSource inputsrc = new InputSource(strReader);
Document document = XMLUtils.newDocument(inputsrc);
/* nothing to scan for (here)
XPath xpath = XPathFactory.newInstance().newXPath();
String expressionForERRORCODE = "//ERRORCODE";
String ips_errorcode = xpath.evaluate(expressionForERRORCODE, document);
*/
</java-code>
Nun muss ich noch die Requestmap per Hand bauen, weiß jedoch absolut nicht, wie ich diesen Teil erzeuge. In der WSDL-Datei (rpc-encoded style) ist dies ein benutzerdefinierter Datentyp. Der SOAP-Request muss folgendes Format haben:
<snip: SOAP>
<CALLER s:type="y:string">USER</CALLER>
<SID s:type="y:string">TEST:1264335072</SID>
<SERVICE s:type="y:string">METASEARCH</SERVICE>
<SUBSERVICE s:type="y:string">INITSEARCH</SUBSERVICE>
<REQUESTMAP s:type="ns1:Map" xmlns:ns1="http://xml.apache.org/xml-soap">
<item>
<key s:type="y:string">TEMPLATE</key>
<value s:type="y:string">FALSE</value>
</item>
<!-- probably even more items -->
<item>
<key s:type="y:string">COUNT</key>
<value s:type="y:string">20</value>
</item>
<item>
<key s:type="y:string">START</key>
<value s:type="y:string">0</value>
</item>
</REQUESTMAP>
</m:IPS_SubServiceCall>
</E:Body>
</E:Envelope>
</soap>
Die WSDL-Datei könnt ihr hier finden: http://www.file-upload.net/download-251 ... .wsdl.html
DANKE für eure Tipps, ich komm hier gerade nicht weiter.
Kay²