Axis2用法:soap消息攜帶消息頭

一、消息頭定義

通常soap消息中,消息體是攜帶消息的核心內容;消息頭中的字段,多數用於校驗。定義消息頭,就至關於定義一個bean對象。本例中,在上一篇的繼承上,爲消息增長消息頭,其中消息頭核心內容包括三個字段:serviceId,servPassWord和timeStamp。源代碼以下:java


 


package com.yht.msg.header;   
apache


  1. /**

/** ide

 * 定義消息頭中包含哪些內容的bean。  * @author Administrator  *  */  public class AttachHeader   {      /**      * 消息節點標籤。      */      public static final String NODEFLAG = "tns";            /**      * 消息頭標籤。      */      public static final String HEADFLAG = "RequestHeader";            /**      * 命名空間。      */      public static final String NAMESPACE = "http://com.yht.msg";            /**      * 時間戳標籤。      */      public static final String TIMESTAMP = "timeStamp";            /**      * 業務編號標籤。      */      public static final String SERVICEID = "serviceId";            /**      * 業務對於的校驗密碼標籤。      */      public static final String SERVPASSWORD = "servPassWord";            /**      * 時間戳。      */      private String timeStamp;            /**      * 業務編號。      */      private String serviceId;            /**      * 業務對於的校驗密碼。      */      private String servPassWord;        /**      * 獲取時間戳。      * @return 時間戳。      */      public String getTimeStamp()       {          return timeStamp;      }        /**      * 設置時間戳。      * @param timeStamp 時間戳。      */      public void setTimeStamp(String timeStamp)       {          this.timeStamp = timeStamp;      }        /**      * 獲取業務編號。      * @return 業務編號。      */      public String getServiceId()       {          return serviceId;      }        /**      * 設置業務編號。      * @param serviceId 業務編號。      */      public void setServiceId(String serviceId)       {          this.serviceId = serviceId;      }        /**      * 獲取校驗密碼。      * @return 校驗密碼。      */      public String getServPassWord()       {          return servPassWord;      }        /**      * 設置校驗密碼。      * @param servPassWord 校驗密碼。      */      public void setServPassWord(String servPassWord)       {          this.servPassWord = servPassWord;      }        }  


二、打包與解析消息頭方法

消息頭中字段定義好了,那麼對於demo做爲:客戶端,發送出去的消息攜帶消息頭,須要一個大包消息頭的方法;服務端,接受別處來的消息,須要一個解析消息頭的方法。這從新定義一個類:DealHeader繼承消息頭定義的類AttachHeader。該類中,有兩個方法:packSoapHeader和parseSoapHeader。源代碼以下:測試


  1. package com.yht.msg.header;  this

  2.   

  3. import java.util.Iterator;  spa

  4.   

  5. import org.apache.axiom.om.OMAbstractFactory;  orm

  6. import org.apache.axiom.om.OMElement;  對象

  7. import org.apache.axiom.om.OMFactory;  繼承

  8. import org.apache.axiom.om.OMNamespace;  element

  9. import org.apache.axiom.soap.SOAPFactory;  

  10. import org.apache.axiom.soap.SOAPHeader;  

  11. import org.apache.axiom.soap.SOAPHeaderBlock;  

  12. import org.apache.axis2.client.ServiceClient;  

  13.   

  14. /** 

  15.  * 提供上下行消息中,處理消息頭的方法。 

  16.  * 做爲服務端,須要解析消息中的消息頭;做爲客戶端,須要在消息頭中加入消息頭。 

  17.  * @author Administrator 

  18.  * 

  19.  */  

  20. public class DealHeader extends AttachHeader  

  21. {  

  22.     /** 

  23.      * 打包消息頭。將設置到AttachHeader中的各字段的內容,打包到消息中發送出去。 

  24.      * @param serviceClient 

  25.      */  

  26.     public void packSoapHeader(ServiceClient serviceClient)  

  27.     {  

  28.         //獲取建立工廠。  

  29.         OMFactory oMFactory = OMAbstractFactory.getOMFactory();  

  30.         SOAPFactory sOAPFactory = OMAbstractFactory.getSOAP11Factory();  

  31.           

  32.         //利用工廠,建立命名空間和消息頭。  

  33.         OMNamespace oMNamespace = oMFactory.createOMNamespace(NAMESPACE, NODEFLAG);  

  34.         SOAPHeaderBlock soapHeader =   

  35.                 sOAPFactory.createSOAPHeaderBlock(HEADFLAG, oMNamespace);  

  36.           

  37.         //消息頭中的時間錯節點。  

  38.         String timeStamp = (getTimeStamp() == null) ? "" : getTimeStamp();  

  39.         SOAPHeaderBlock timeBlock =   

  40.                 sOAPFactory.createSOAPHeaderBlock(TIMESTAMP, oMNamespace);  

  41.         timeBlock.addChild(sOAPFactory.createOMText(timeStamp));  

  42.           

  43.         //消息頭中的業務表示節點。  

  44.         String serviceId = (getServiceId() == null) ? "" : getServiceId();  

  45.         SOAPHeaderBlock serviceIdBlock =   

  46.                 sOAPFactory.createSOAPHeaderBlock(SERVICEID, oMNamespace);  

  47.         serviceIdBlock.addChild(sOAPFactory.createOMText(serviceId));  

  48.           

  49.         //消息頭中的業務校驗密碼節點。  

  50.         String servPassWord = (getServPassWord() == null) ? "" : getServPassWord();  

  51.         SOAPHeaderBlock servPassWordBlock =   

  52.                 sOAPFactory.createSOAPHeaderBlock(SERVPASSWORD, oMNamespace);  

  53.         servPassWordBlock.addChild(sOAPFactory.createOMText(servPassWord));  

  54.           

  55.         //將各個節點加入到消息頭中。  

  56.         soapHeader.addChild(serviceIdBlock);  

  57.         soapHeader.addChild(servPassWordBlock);  

  58.         soapHeader.addChild(timeBlock);  

  59.           

  60.         //將消息頭加入到當前消息中。  

  61.         serviceClient.addHeader(soapHeader);  

  62.     }  

  63.       

  64.     /** 

  65.      * 解析消息頭。做爲服務端接受消息時,將當前消息中的消息頭取出,單獨解析成AttachHeader中設定的字段的值。 

  66.      * @param soapHeader 

  67.      */  

  68.     public void parseSoapHeader(SOAPHeader soapHeader)  

  69.     {  

  70.         //消息頭非空判斷。  

  71.         if(soapHeader == null)  

  72.         {  

  73.             return ;  

  74.         }  

  75.           

  76.         //獲取消息流中的消息頭列表,並作非空判斷。  

  77.         Iterator<?> headerList = soapHeader.examineHeaderBlocks(null);  

  78.         if(headerList == null)  

  79.         {  

  80.             return ;  

  81.         }  

  82.           

  83.         //獲取第一個消息頭,並獲取消息頭中的元素。  

  84.         SOAPHeaderBlock header = (SOAPHeaderBlock)headerList.next();  

  85.         Iterator<?> elementList = header.getChildElements();  

  86.           

  87.         OMElement element = null;  

  88.         String key = null;  

  89.         String value = null;  

  90.         if(elementList != null)  

  91.         {  

  92.             //解析非空列表中的全部節點。  

  93.             while(elementList.hasNext())  

  94.             {  

  95.                 //獲取節點key和value值。  

  96.                 element = (OMElement)elementList.next();  

  97.                 key = element.getLocalName();  

  98.                 value = element.getText().trim();  

  99.                   

  100.                 //若是是業務標籤,將值設置。  

  101.                 if(SERVICEID.equals(key))  

  102.                 {  

  103.                     setServiceId(value);  

  104.                 }  

  105.                   

  106.                 //若是是校驗密碼,將值設置。  

  107.                 if(SERVPASSWORD.equals(key))  

  108.                 {  

  109.                     setServPassWord(value);  

  110.                 }  

  111.                   

  112.                 //若是是時間戳,將值設置。  

  113.                 if(TIMESTAMP.equals(key))  

  114.                 {  

  115.                     setTimeStamp(value);  

  116.                 }  

  117.             }  

  118.         }  

  119.     }  

  120. }  

三、客戶端服務端攜帶消息頭

客戶端大包消息頭和服務端解析消息頭的方法都定義好了,那麼如何大包解析呢?

(1)客戶端

對於上篇中封裝的客戶端類SendAttachClient,要實現打包須要作以下步驟:

1、SendAttachClient繼承DealHeader。

2、根據服務地址,建立一個發送消息的客戶端時,打包消息頭。以下代碼:


  1. //一、根據服務地址,建立一個發送消息的客戶端。  


  2. try  

  3. {  

  4.     stub = new SendAttachServiceStub(serviceAddress);  

  5.     packSoapHeader(stub._getServiceClient());  

  6. }  

  7. catch (AxisFault e1)  

  8. {  

  9.     // TODO Auto-generated catch block  

  10.     e1.printStackTrace();  

  11. }  

3、測試代碼,增長設置消息頭字段的代碼。源代碼以下:

  1. package main;  


  2.   

  3. import java.text.SimpleDateFormat;  

  4. import java.util.Calendar;  

  5.   

  6. import com.yht.msg.client.SendAttachClient;  

  7.   

  8. /** 

  9.  * 客戶端測試類。 

  10.  * @author Administrator 

  11.  * 

  12.  */  

  13. public class Test   

  14. {  

  15.     /** 

  16.      * 入口方法。 

  17.      * @param args 

  18.      */  

  19.     public static void main(String[] args)  

  20.     {  

  21.         //獲取系統時間,爲日曆對象。    

  22.         Calendar calendar = Calendar.getInstance();   

  23.         SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH:mm:ss");  

  24.         String time = simpleDateFormat.format(calendar.getTime());  

  25.           

  26.         String result = null;  

  27.         String subject = "Hello Axis2-1.6.2!";  

  28.         String serviceAddress = "http://127.0.0.1:8088/SendAttachService";  

  29.         String serviceId = "12345";  

  30.         String servPassWord = "54321";  

  31.         String timeStamp = time;  

  32.           

  33.         //建立客戶端類。  

  34.         SendAttachClient client = new SendAttachClient();  

  35.           

  36.         client.setServiceId(serviceId);  

  37.         client.setServPassWord(servPassWord);  

  38.         client.setTimeStamp(timeStamp);  

  39.           

  40.         //設置消息體內容。  

  41.         client.setSubject(subject);  

  42.           

  43.         //設置服務地址。  

  44.         client.setServiceAddress(serviceAddress);  

  45.           

  46.         //發送消息獲取,結果。  

  47.         result = client.sendAttach();  

  48.           

  49.         //打印結果。  

  50.         System.out.println(result);  

  51.     }  

  52. }  

(2)服務端

做爲服務端,只要獲取當前消息中的消息頭;new一個打包消息的類對象,將消息頭放到對象中解析;消息中的值就消息到該對象中。對於上一篇中的服務端類GetAttachService,增長解析消息頭能力後,源代碼以下:


  1. package com.yht.msg.service;  

  2.   

  3. import org.apache.axiom.soap.SOAPHeader;  

  4. import org.apache.axis2.context.MessageContext;  

  5.   

  6. import com.yht.msg.SendAttach;  

  7. import com.yht.msg.SendAttachResponse;  

  8. import com.yht.msg.SendAttachServiceSkeletonInterface;  

  9. import com.yht.msg.header.DealHeader;  

  10.   

  11. /** 

  12.  * 服務端,接受消息。 

  13.  * @author Administrator 

  14.  * 

  15.  */  

  16. public class GetAttachService   

  17.     implements SendAttachServiceSkeletonInterface  

  18. {  

  19.     /** 

  20.      * 接受消息並返回相應的相應。 

  21.      */  

  22.     public SendAttachResponse sendAttach(SendAttach arg0)   

  23.     {  

  24.         //獲取上下行消息中的消息頭。  

  25.         MessageContext context = MessageContext.getCurrentMessageContext();  

  26.         SOAPHeader soapHeader = context.getEnvelope().getHeader();  

  27.           

  28.         //解析消息頭。  

  29.         DealHeader dealHeader = new DealHeader();  

  30.         dealHeader.parseSoapHeader(soapHeader);  

  31.           

  32.         // TODO Auto-generated method stub  

  33.         System.out.println(dealHeader.getServiceId());  

  34.         System.out.println(dealHeader.getServPassWord());  

  35.         System.out.println(dealHeader.getTimeStamp());  

  36.         System.out.println(arg0.getArgs0());  

  37.           

  38.         //響應。  

  39.         SendAttachResponse response = new SendAttachResponse();  

  40.         response.set_return("success");  

  41.         return response;  

  42.     }  

  43.       

  44. }  

相關文章
相關標籤/搜索