【轉】Spring的WebServiceTemplate訪問WebService的方法及其本質原理


WebService客戶端調用的本質就是將SAOP格式的XML通過通信協議發送到WebService的服務器端,然后接收服務器端返回的XML.

本文簡單介紹一下如何通過Spring提供的WebServiceTemplate訪問Webservice,WebServiceTemplate與調用webservice的客戶端已及webservice服務器端示意圖如下(圖片來源於Spring in Action):

這里以SOAP over HTTP為例,開發步驟如下:

1,在Spring的配置文件中配置WebServiceTemplate,最簡單的配置如下:

[html]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. <bean id="webServiceTemplate" class="org.springframework.ws.client.core.WebServiceTemplate">  
  2.     <property name="defaultUri" value="http://localhost:8080/prjCXFWS/services/SimpleServicePort"/>  
  3. </bean>     

*這種配置省略了MessageFactory和messageSender的配置,Spring默認會使用SaajSoapMessageFactory和HttpUrlConnectionMessageSender.等同於下面的配置

[html]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. <bean id="messageFactory" class="org.springframework.ws.soap.saaj.SaajSoapMessageFactory"/>  
  2. <bean id="webServiceTemplate" class="org.springframework.ws.client.core.WebServiceTemplate">  
  3.     <constructor-arg ref="messageFactory"/>  
  4.     <property name="messageSender">  
  5.         <bean class="org.springframework.ws.transport.http.HttpUrlConnectionMessageSender"/>  
  6.     </property>  
  7.     <property name="defaultUri" value="http://localhost:8080/prjCXFWS/services/SimpleServicePort" />  
  8. </bean>  

還可以使用CommonsHttpMessageSender作為messageSender,它提供了設置timeout,用戶名,密碼等選項的功能.(需要使用commons-httpclient.jar和commons-codec.jar)
MessageFactory還可以使用AxiomSoapMessageFactory和DomPoxMessageFactory.

[html]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. <bean id="webServiceTemplate" class="org.springframework.ws.client.core.WebServiceTemplate">  
  2.     <property name="messageSender">  
  3.      <bean class="org.springframework.ws.transport.http.CommonsHttpMessageSender">  
  4.       <property name="readTimeout" value="0" />  
  5.      </bean>  
  6.     </property>  
  7.     <property name="defaultUri" value="http://localhost:8080/prjCXFWS/services/SimpleServicePort" />  
  8. </bean>  

2,Java調用代碼:傳輸的是SOAP XML.

[java]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. private static final String MESSAGE =  
  2.        "<queryPeopleByID  xmlns=\"http://test.cxfws.com\">1231ss</queryPeopleByID> ";  
  3. public static void test() {  
  4.     ApplicationContext ac = new ClassPathXmlApplicationContext("conf/wsAppcontext.xml");  
  5.     WebServiceTemplate simpleService = (WebServiceTemplate) ac.getBean("webServiceTemplate");  
  6.     StreamSource source = new StreamSource(new StringReader(MESSAGE));  
  7.        StreamResult result = new StreamResult(System.out);          
  8.        simpleService.sendSourceAndReceiveToResult(source, result);  
  9. }  

*MESSAGE為需要發送到webservice服務器端的XML payload內容,SOAP body之內的XML內容.

Spring調用Webservice的另一種方法是通過Spring提供的JaxWsPortProxyFactoryBean,示意圖如下(圖片來源於Spring in Action):

Spring的配置如下:

[html]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. <bean id="simpleService"  
  2.     class="org.springframework.remoting.jaxws.JaxWsPortProxyFactoryBean">  
  3.     <property name="serviceInterface"  
  4.         value="com.cxfclient.test.SimpleService" />  
  5.     <property name="wsdlDocumentUrl"  
  6.         value="http://localhost:8080/prjCXFWS/services/SimpleServicePort?WSDL" />  
  7.     <property name="namespaceUri" value="http://test.cxfws.com/" />  
  8.     <property name="serviceName" value="SimpleServiceService" />  
  9.     <property name="portName" value="SimpleServicePort" />  
  10. </bean>  

**這種方式需要用工具通過Webservice 的wsdl文件生成客戶端需要的一些Java類,如service的interface,參數類等等(如下面代碼中的SimpleService,People類).
Java調用代碼如下

[java]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. ApplicationContext ac = new ClassPathXmlApplicationContext("conf/wsAppcontext.xml");  
  2. SimpleService simpleService = (SimpleService) ac.getBean("simpleService");  
  3.   
  4. People people = simpleService.queryPeopleByID("test");  
  5. System.out.println(people.getAge() + people.getName() + people.getPid());  

 

關於更多客戶端如何調用webservice,參照http://blog.csdn.net/kkdelta/article/details/3987591
對於服務器端,其本質也是接收符合SOAP規范的XML消息,解析XML,返回符合SOAP規范的XML,這里用一個servlet模擬webservice,代碼如下:

 

[java]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. public class WSSimulator extends HttpServlet {  
  2.     public void doGet(HttpServletRequest request, HttpServletResponse response)  
  3.     throws IOException {  
  4.         System.out.println("doGet");  
  5.         BufferedReader in = new BufferedReader(new InputStreamReader( request.getInputStream()));  
  6.         String str;  
  7.         while ((str = in.readLine()) != null) {  
  8.             System.out.println(str); ##1  
  9.         }  
  10.         in.close();  
  11.           
  12.         String soapHeader = "<SOAP-ENV:Envelope xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\">"   
  13.             +"<SOAP-ENV:Header/><SOAP-ENV:Body>";  
  14.         String soapPayload = "<xxx>yyy</xxx>";  
  15.         String soapTail = "</SOAP-ENV:Body></SOAP-ENV:Envelope>";         
  16.         response.getWriter().write(soapHeader + soapPayload + soapTail);  ##2     
  17.     }  
  18.     public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {  
  19.         System.out.println("doPost");  
  20.         doGet(request, response);  
  21.     }  
  22. }  

 

通過WebServiceTemplate將消息發送到這個servlet監聽的url,可以更深理解Webservice的本質.
##1 str就是從客戶端傳輸到服務器端的XML.##2將SOAP消息返回給客戶端.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM