Axis2用法——soap消息携带消息头

1、消息头定义

一般soap消息中,消息体是携带消息的核心内容;消息头中的字段,多数用于校验。定义消息头,就相当于定义一个bean对象。本例中,在上一篇的继承上,为消息增加消息头,其中消息头核心内容包括三个字段:serviceId,servPassWord和timeStamp。源代码如下:
[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. package com.yht.msg.header;  
  2.   
  3. /** 
  4.  * 定义消息头中包含哪些内容的bean。 
  5.  * @author Administrator 
  6.  * 
  7.  */  
  8. public class AttachHeader   
  9. {  
  10.     /** 
  11.      * 消息节点标签。 
  12.      */  
  13.     public static final String NODEFLAG = "tns";  
  14.       
  15.     /** 
  16.      * 消息头标签。 
  17.      */  
  18.     public static final String HEADFLAG = "RequestHeader";  
  19.       
  20.     /** 
  21.      * 命名空间。 
  22.      */  
  23.     public static final String NAMESPACE = "http://com.yht.msg";  
  24.       
  25.     /** 
  26.      * 时间戳标签。 
  27.      */  
  28.     public static final String TIMESTAMP = "timeStamp";  
  29.       
  30.     /** 
  31.      * 业务编号标签。 
  32.      */  
  33.     public static final String SERVICEID = "serviceId";  
  34.       
  35.     /** 
  36.      * 业务对于的校验密码标签。 
  37.      */  
  38.     public static final String SERVPASSWORD = "servPassWord";  
  39.       
  40.     /** 
  41.      * 时间戳。 
  42.      */  
  43.     private String timeStamp;  
  44.       
  45.     /** 
  46.      * 业务编号。 
  47.      */  
  48.     private String serviceId;  
  49.       
  50.     /** 
  51.      * 业务对于的校验密码。 
  52.      */  
  53.     private String servPassWord;  
  54.   
  55.     /** 
  56.      * 获取时间戳。 
  57.      * @return 时间戳。 
  58.      */  
  59.     public String getTimeStamp()   
  60.     {  
  61.         return timeStamp;  
  62.     }  
  63.   
  64.     /** 
  65.      * 设置时间戳。 
  66.      * @param timeStamp 时间戳。 
  67.      */  
  68.     public void setTimeStamp(String timeStamp)   
  69.     {  
  70.         this.timeStamp = timeStamp;  
  71.     }  
  72.   
  73.     /** 
  74.      * 获取业务编号。 
  75.      * @return 业务编号。 
  76.      */  
  77.     public String getServiceId()   
  78.     {  
  79.         return serviceId;  
  80.     }  
  81.   
  82.     /** 
  83.      * 设置业务编号。 
  84.      * @param serviceId 业务编号。 
  85.      */  
  86.     public void setServiceId(String serviceId)   
  87.     {  
  88.         this.serviceId = serviceId;  
  89.     }  
  90.   
  91.     /** 
  92.      * 获取校验密码。 
  93.      * @return 校验密码。 
  94.      */  
  95.     public String getServPassWord()   
  96.     {  
  97.         return servPassWord;  
  98.     }  
  99.   
  100.     /** 
  101.      * 设置校验密码。 
  102.      * @param servPassWord 校验密码。 
  103.      */  
  104.     public void setServPassWord(String servPassWord)   
  105.     {  
  106.         this.servPassWord = servPassWord;  
  107.     }  
  108.       
  109. }  

2、打包与解析消息头方法

消息头中字段定义好了,那么对于demo作为:客户端,发送出去的消息携带消息头,需要一个大包消息头的方法;服务端,接受别处来的消息,需要一个解析消息头的方法。这重新定义一个类:DealHeader继承消息头定义的类AttachHeader。该类中,有两个方法:packSoapHeader和parseSoapHeader。源代码如下:
[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. package com.yht.msg.header;  
  2.   
  3. import java.util.Iterator;  
  4.   
  5. import org.apache.axiom.om.OMAbstractFactory;  
  6. import org.apache.axiom.om.OMElement;  
  7. import org.apache.axiom.om.OMFactory;  
  8. import org.apache.axiom.om.OMNamespace;  
  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. }  

3、客户端服务端携带消息头

客户端大包消息头和服务端解析消息头的方法都定义好了,那么如何大包解析呢?

(1)客户端

对于上篇中封装的客户端类SendAttachClient,要实现打包需要做如下步骤:
一、SendAttachClient继承DealHeader。
二、根据服务地址,创建一个发送消息的客户端时,打包消息头。如下代码:
[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. //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. }  

三、测试代码,增加设置消息头字段的代码。源代码如下:
[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  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,增加解析消息头能力后,源代码如下:
[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  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. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值