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

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介:

1、消息头定义

一般soap消息中,消息体是携带消息的核心内容;消息头中的字段,多数用于校验。定义消息头,就相当于定义一个bean对象。本例中,在上一篇的继承上,为消息增加消息头,其中消息头核心内容包括三个字段:serviceId,servPassWord和timeStamp。源代码如下:


 

1
<br>

package com.yht.msg.header;   


  1. /**

/** 

 * 定义消息头中包含哪些内容的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;      }        }  


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

消息头中字段定义好了,那么对于demo作为:客户端,发送出去的消息携带消息头,需要一个大包消息头的方法;服务端,接受别处来的消息,需要一个解析消息头的方法。这重新定义一个类:DealHeader继承消息头定义的类AttachHeader。该类中,有两个方法:packSoapHeader和parseSoapHeader。源代码如下:


  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。

二、根据服务地址,创建一个发送消息的客户端时,打包消息头。如下代码:


  1. //1、根据服务地址,创建一个发送消息的客户端。  

  2. 1
    <br>
  3. try  

  4. {  

  5.     stub = new SendAttachServiceStub(serviceAddress);  

  6.     packSoapHeader(stub._getServiceClient());  

  7. }  

  8. catch (AxisFault e1)  

  9. {  

  10.     // TODO Auto-generated catch block  

  11.     e1.printStackTrace();  

  12. }  

三、测试代码,增加设置消息头字段的代码。源代码如下:

  1. package main;  

  2. 1
    <br>
  3.   

  4. import java.text.SimpleDateFormat;  

  5. import java.util.Calendar;  

  6.   

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

  8.   

  9. /** 

  10.  * 客户端测试类。 

  11.  * @author Administrator 

  12.  * 

  13.  */  

  14. public class Test   

  15. {  

  16.     /** 

  17.      * 入口方法。 

  18.      * @param args 

  19.      */  

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

  21.     {  

  22.         //获取系统时间,为日历对象。    

  23.         Calendar calendar = Calendar.getInstance();   

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

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

  26.           

  27.         String result = null;  

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

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

  30.         String serviceId = "12345";  

  31.         String servPassWord = "54321";  

  32.         String timeStamp = time;  

  33.           

  34.         //创建客户端类。  

  35.         SendAttachClient client = new SendAttachClient();  

  36.           

  37.         client.setServiceId(serviceId);  

  38.         client.setServPassWord(servPassWord);  

  39.         client.setTimeStamp(timeStamp);  

  40.           

  41.         //设置消息体内容。  

  42.         client.setSubject(subject);  

  43.           

  44.         //设置服务地址。  

  45.         client.setServiceAddress(serviceAddress);  

  46.           

  47.         //发送消息获取,结果。  

  48.         result = client.sendAttach();  

  49.           

  50.         //打印结果。  

  51.         System.out.println(result);  

  52.     }  

  53. }  

(2)服务端

作为服务端,只要获取当前消息中的消息头;new一个打包消息的类对象,将消息头放到对象中解析;消息中的值就消息到该对象中。对于上一篇中的服务端类GetAttachService,增加解析消息头能力后,源代码如下:

1
<br>
  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. }  



本文转自 www19 51CTO博客,原文链接:http://blog.51cto.com/doujh/1706153,如需转载请自行联系原作者
相关文章
|
3月前
|
存储 缓存 监控
|
6月前
|
安全 数据处理 C#
C# Post数据或文件到指定的服务器进行接收
C# Post数据或文件到指定的服务器进行接收
|
数据库
SIP 协议消息应答代码解释详录
SIP 协议消息应答代码解释详录
|
安全 网络协议 数据格式
HTTP的概念以及请求消息的数据格式
HTTP的概念以及请求消息的数据格式
67 0
|
数据安全/隐私保护
SIP响应消息和头字段
SIP响应消息和头字段
|
XML 数据安全/隐私保护 数据格式
axis客户端接收不同参数类型
axis只支持简单类型的返回值。在这里逐一介绍axis的各种返回值接受。 1:axis接受基本类型,如int ,string等 引入的系统文件: import javax.xml.namespace.QName; import javax.xml.rpc.ParameterMode; import javax.xml.rpc.ServiceException;
347 0
|
Web App开发 数据安全/隐私保护 网络架构