I am programming a simple proxy in java:
- Read XML File
- Send request to Web-Service
- Read Web-Service response
- Write response to file
My first attempt is using JAXB to read the xml-file and generating Java-Objects. Then I send the objects with JAX-WS (IBM WebSphere). I receive the response as a "ResponseObject" which is then generated into xml code. I write the XML-Code to a file.
This setup works good. But...
When sending the java objects to the WebService, xml is generated, and the response agains creates java objects. I really would not need those request and response objects. Is there a way to directly invoke the WebService with plaintext xml? And to read the response as plaintext xml, instead of those response objects?
(Lets assume the xml files are always valid.)
Thank you开发者_Go百科
One could use SAAJ (SOAP with Attachments API for Java) which runs at a lower level than JAX-WS. I expect it to use less system resources than JAX-WS.
See the following example (copied from users.skynet.be/pascalbotte/rcx-ws-doc/saajpost.htm)
No more dynamic construction of the SOAP message this time, let's use a simple text editor and type the soap message we want to send.
Example 1-13. The formated SOAP message in a text file: prepared.msg
<SOAP-ENV:Envelope
SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:enc="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<SOAP-ENV:Header/><SOAP-ENV:Body>
<ans1:readLS xmlns:ans1="http://phonedirlux.homeip.net/types">
<String_1 xsi:type="xsd:string">your message or e-mail</String_1>
</ans1:readLS>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
Now the code will be shorter and you can easily use it for testing purpose.
Example 1-14. Post a SOAP message in a text file, to a web service using SAAJ
import javax.xml.soap.SOAPConnectionFactory;
import javax.xml.soap.SOAPConnection;
import javax.xml.soap.MessageFactory;
import javax.xml.soap.SOAPMessage;
import javax.xml.soap.SOAPPart;
import java.io.FileInputStream;
import javax.xml.transform.stream.StreamSource;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.Source;
import javax.xml.transform.stream.StreamResult;
public class Client {
public static void main(String[] args) {
try {
// Create the connection
SOAPConnectionFactory scf = SOAPConnectionFactory.newInstance();
SOAPConnection conn = scf.createConnection();
// Create message
MessageFactory mf = MessageFactory.newInstance();
SOAPMessage msg = mf.createMessage();
// Object for message parts
SOAPPart sp = msg.getSOAPPart();
StreamSource prepMsg = new StreamSource(
new FileInputStream("path/prepared.msg"));
sp.setContent(prepMsg);
// Save message
msg.saveChanges();
// View input
System.out.println("\n Soap request:\n");
msg.writeTo(System.out);
System.out.println();
// Send
String urlval = "http://www.pascalbotte.be/rcx-ws/rcx";
SOAPMessage rp = conn.call(msg, urlval);
// View the output
System.out.println("\nXML response\n");
// Create transformer
TransformerFactory tff = TransformerFactory.newInstance();
Transformer tf = tff.newTransformer();
// Get reply content
Source sc = rp.getSOAPPart().getContent();
// Set output transformation
StreamResult result = new StreamResult(System.out);
tf.transform(sc, result);
System.out.println();
// Close connection
conn.close();
}
catch (Exception e) {
System.out.println(e.getMessage());
}
}
}
精彩评论