开发者

Webservice-Client: Use plain-text xml instead of object hierarchy

开发者 https://www.devze.com 2022-12-18 14:57 出处:网络
I am programming a simple proxy in java: Read XML File Send request to Web-Service Read Web-Service response

I am programming a simple proxy in java:

  1. Read XML File
  2. Send request to Web-Service
  3. Read Web-Service response
  4. 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());
      }
    }
  }
0

精彩评论

暂无评论...
验证码 换一张
取 消