2012年5月18日金曜日

StringでSOAP通信

wsdlからwsimportを使って自動生成したJavaクラスSayHelloを使って、SOAPメッセージ(xml)をString型で生成し、
そのStringをURLConnectionでHTTP送受信する。
で、レスポンスをStringにして
SOAPMessageに戻す。

SOAPMessageからSOAPEnvelopeの子要素をorg.w3c.dom.Nodeオブジェクトで取得。
最後に、JAXBのUnmarshallでNodeからSayHelloResponse(wsimportで生成されたSOAPの応答のクラス)に変換する。
あとは、いつものSOAPです。


以上! ソースが汚すぎるから、明日整形しましょうかね。

  1. /** 
  2.  *  
  3.  */  
  4. package jp.blogspot.tanakanbb;  
  5.   
  6. import java.io.BufferedReader;  
  7. import java.io.BufferedWriter;  
  8. import java.io.ByteArrayInputStream;  
  9. import java.io.ByteArrayOutputStream;  
  10. import java.io.InputStreamReader;  
  11. import java.io.OutputStreamWriter;  
  12. import java.io.StringWriter;  
  13. import java.net.URL;  
  14. import java.net.URLConnection;  
  15.   
  16. import javax.xml.bind.JAXBContext;  
  17. import javax.xml.bind.Marshaller;  
  18. import javax.xml.bind.Unmarshaller;  
  19. import javax.xml.parsers.DocumentBuilderFactory;  
  20. import javax.xml.soap.MessageFactory;  
  21. import javax.xml.soap.SOAPMessage;  
  22. import javax.xml.soap.SOAPPart;  
  23. import javax.xml.transform.Transformer;  
  24. import javax.xml.transform.TransformerFactory;  
  25. import javax.xml.transform.dom.DOMSource;  
  26. import javax.xml.transform.stream.StreamResult;  
  27. import javax.xml.transform.stream.StreamSource;  
  28.   
  29. import org.w3c.dom.Document;  
  30.   
  31. import com.tanakanbb.sample.soap.SayHello;  
  32. import com.tanakanbb.sample.soap.SayHelloResponse;  
  33.   
  34. public class JaxWSExecutor {  
  35.   
  36.  public static void main(String[] args) throws Exception {  
  37.   
  38.   DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();  
  39.   dbf.setNamespaceAware(true);  
  40.   Document doc = dbf.newDocumentBuilder().newDocument();  
  41.   
  42.   JAXBContext context = JAXBContext.newInstance(SayHello.class);  
  43.   Marshaller marshaller = context.createMarshaller();  
  44.   marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);  
  45.   
  46.   SayHello sayHello = new SayHello();  
  47.   
  48.   sayHello.setName("hoge");  
  49.   
  50.   marshaller.marshal(sayHello, doc);  
  51.   
  52.   // We now have a DOM tree which has been populated by JAX-B  
  53.   MessageFactory factory = MessageFactory.newInstance();  
  54.   SOAPMessage message = factory.createMessage();  
  55.   message.getSOAPBody().addDocument(doc);  
  56.   
  57.   message.saveChanges();  
  58.   
  59.   ByteArrayOutputStream outputStream = new ByteArrayOutputStream();  
  60.   
  61.   message.writeTo(outputStream);  
  62.   
  63.   String xml = outputStream.toString("utf-8");  
  64.   
  65.   // <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"><SOAP-ENV:Header/><SOAP-ENV:Body><sayHello xmlns="http://soap.sample.tanakanbb.com"><name>hoge</name></sayHello></SOAP-ENV:Body></SOAP-ENV:Envelope>  
  66.   System.out.println(xml);  
  67.   try {  
  68.    URL url = new URL(  
  69.      "http://localhost:8084/soap_sample/services/Hello");  
  70.   
  71.    URLConnection con = url.openConnection();  
  72.   
  73.    // 送信するよ!指定  
  74.    con.setDoOutput(true);  
  75.   
  76.    con.setRequestProperty("Content-Type""application/soap+xml");  
  77.    con.setRequestProperty("SoapAction""");  
  78.   
  79.    // --------------------  
  80.    // 送信する  
  81.    // --------------------  
  82.    OutputStreamWriter ow1 = new OutputStreamWriter(con  
  83.      .getOutputStream());  
  84.    BufferedWriter bw1 = new BufferedWriter(ow1);  
  85.   
  86.    // POSTの内容を書き出す  
  87.    bw1.write(xml);  
  88.   
  89.    // クローズ  
  90.    bw1.close();  
  91.    ow1.close();  
  92.   
  93.    // --------------------  
  94.    // 受信する  
  95.    // --------------------  
  96.    InputStreamReader ir1 = new InputStreamReader(con.getInputStream());  
  97.    BufferedReader br1 = new BufferedReader(ir1);  
  98.   
  99.    ByteArrayOutputStream ba = new ByteArrayOutputStream();  
  100.    // 1行ずつ書き出す  
  101.    int b;  
  102.    while ((b = br1.read()) != -1) {  
  103.     ba.write(b);  
  104.    }  
  105.   
  106.    String response = ba.toString("utf-8");  
  107.   
  108.    // クローズ  
  109.    br1.close();  
  110.    ir1.close();  
  111.    ba.close();  
  112.   
  113.    // <?xml version="1.0" encoding="UTF-8"?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><soapenv:Body><sayHelloResponse xmlns="http://soap.sample.tanakanbb.com"><sayHelloReturn>Hello!, hoge</sayHelloReturn></sayHelloResponse></soapenv:Body></soapenv:Envelope>  
  114.    System.out.println(response);  
  115.   
  116.    // Create SoapMessage  
  117.    MessageFactory msgFactory = MessageFactory.newInstance();  
  118.    SOAPMessage message2 = msgFactory.createMessage();  
  119.    SOAPPart soapPart = message2.getSOAPPart();  
  120.   
  121.    // Load the SOAP text into a stream source  
  122.    byte[] buffer = response.getBytes();  
  123.    ByteArrayInputStream stream = new ByteArrayInputStream(buffer);  
  124.    StreamSource source = new StreamSource(stream);  
  125.   
  126.    // Set contents of message  
  127.    soapPart.setContent(source);  
  128.   
  129.    // -- DONE  
  130.    // <?xml version="1.0" encoding="UTF-8"?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><soapenv:Body><sayHelloResponse xmlns="http://soap.sample.tanakanbb.com"><sayHelloReturn>Hello!, hoge</sayHelloReturn></sayHelloResponse></soapenv:Body></soapenv:Envelope>  
  131.    message2.writeTo(System.out);  
  132.   
  133.    System.out.println("");  
  134.   
  135.    org.w3c.dom.Node srcNode = message2.getSOAPPart().getEnvelope()  
  136.      .getBody().getFirstChild();  
  137.   
  138.    StringWriter writer = new StringWriter();  
  139.   
  140.    Transformer transformer = TransformerFactory.newInstance()  
  141.      .newTransformer();  
  142.    transformer.transform(new DOMSource(srcNode), new StreamResult(  
  143.      writer));  
  144.   
  145.    // <?xml version="1.0" encoding="UTF-8"?><sayHelloResponse xmlns="http://soap.sample.tanakanbb.com"><sayHelloReturn>Hello!, hoge</sayHelloReturn></sayHelloResponse>  
  146.    System.out.println(writer.toString());  
  147.   
  148.    JAXBContext context2 = JAXBContext  
  149.      .newInstance(SayHelloResponse.class);  
  150.   
  151.    Unmarshaller m = context2.createUnmarshaller();  
  152.    Object obj = m.unmarshal(srcNode);  
  153.    SayHelloResponse ret = (SayHelloResponse) obj;  
  154.   
  155.    // Hello!, hoge  
  156.    System.out.println(ret.getSayHelloReturn());  
  157.   
  158.   } catch (Exception e) {  
  159.    e.printStackTrace();  
  160.   }  
  161.   
  162.  }  
  163. }  

0 件のコメント:

コメントを投稿