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,如需转载请自行联系原作者
相关文章
|
2月前
|
存储 缓存 监控
|
5月前
|
安全 数据处理 C#
C# Post数据或文件到指定的服务器进行接收
C# Post数据或文件到指定的服务器进行接收
|
数据库
SIP 协议消息应答代码解释详录
SIP 协议消息应答代码解释详录
|
10月前
|
XML JSON JavaScript
JsonRPC协议详解(协议介绍、请求示例、响应示例)
RPC(远程过程调用)是一种用于实现分布式系统中不同进程或不同计算机之间通信的技术。它允许我们像调用本地函数一样调用远程计算机上的函数,使得分布式系统的开发变得更加简单和高效。 JsonRPC是一种基于JSON(JavaScript Object Notation)的轻量级远程过程调用协议。与其他RPC协议相比,JsonRPC使用简单的文本格式进行通信,易于阅读和编写,广泛应用于Web服务和分布式系统中。
758 0
|
Web App开发 JSON 缓存
HTTP的请求方法,空行,body,介绍请求报头的内部以及粘包问题
HTTP的请求方法,空行,body,介绍请求报头的内部以及粘包问题
|
安全 网络协议 数据格式
HTTP的概念以及请求消息的数据格式
HTTP的概念以及请求消息的数据格式
62 0
|
JSON 数据格式
QT 给http服务器发送GET/POST请求并接收返回值
QT 给http服务器发送GET/POST请求并接收返回值
QT 给http服务器发送GET/POST请求并接收返回值
|
网络协议 安全 应用服务中间件
网络-http协议学习笔记(消息结构、请求方法、状态码等)
网络-http协议学习笔记(消息结构、请求方法、状态码等)
137 0
网络-http协议学习笔记(消息结构、请求方法、状态码等)
|
数据安全/隐私保护
SIP响应消息和头字段
SIP响应消息和头字段