`

soap报头与处理

 
阅读更多
转至:http://www.blogjava.net/fool/archive/2006/11/13/80901.html
soap报头与处理
   SOAPHeaderElement 对象中的属性决定了接收者怎样处理消息,可以认为header属性提供了扩展消息的方法,给出了像身份认证,支付,转发消息这样的相关的事情。JAX-RPC客户API(占位程序,动态代理,DII)均没有提供对SOAP文件头的支持,SAAJ API提供了支持。所有消息处理程序都必须实现javax.xml.rpc.handler.Handler接口,该接口有一系列的方法用以处理soap消息。javax.xml.rpc.handler.GenericHandler是一个缺省适配器类,创建我们自己的消息处理程序的时候从该类继承覆写我们自己感兴趣的方法就可以了。但每一个handler必须实现 getHeader()方法跟 handleRequest()方法.具体实现:
服务类HandlerServic:
package handler;
 
public class HandlerService implements HandlerServiceInterface1 {
  public void testInOutHeader(String bodyMsg, String headerMsg)
   {
      System.out.print("testInHeader: " + bodyMsg + "," + headerMsg);
 
   }
 
}
 

消息处理类:
package handler;
 
import javax.xml.rpc.handler.*;
import javax.xml.soap.*;
import javax.xml.namespace.QName;
import javax.xml.rpc.JAXRPCException;
import javax.xml.rpc.handler.soap.SOAPMessageContext;
import java.util.Iterator;
 
public class CutomerHandler extends GenericHandler {
    protected QName[] headers = new QName[] {
                                new QName("http://handler", "headerMsg")
    };
    public QName[] getHeaders() {
        return headers;
    }// 返回handler要处理的文件头元素名的素组.
 
    // 处理接收到的soap消息.如果返回值为false时JAX-RPC会立即中断对SOAP消息处理并将soap消息回传。关于saaj api使用方法见j2ee web service开发(三)
    public boolean handleRequest(MessageContext msgContext) {
 
        try {
            SOAPMessage soapMessage = ((SOAPMessageContext) msgContext).
                                      getMessage();
            SOAPHeader soapHeader = soapMessage.getSOAPHeader();
            Iterator it = soapHeader.extractAllHeaderElements();
            while (it.hasNext()) {
                SOAPHeaderElement headerElement = (SOAPHeaderElement) it.next();
                Name headerName = headerElement.getElementName();
                System.out.println(" header name is: " +
                                   headerName.getQualifiedName());
                System.out.println(" header value is: " +
                                   headerElement.getValue());
            }
            SOAPBody soapBody = soapMessage.getSOAPBody();
            Iterator bodyIterator = soapBody.getChildElements();
            while (bodyIterator.hasNext()) {
                SOAPBodyElement soapBodyElement = (SOAPBodyElement)
                                                  bodyIterator.next();
                System.out.println("soapBodyElement print: " +
                                   soapBodyElement.getNodeName());
            }
            SOAPBodyElement nextSoapBodyElement = (SOAPBodyElement) soapBody.
                                                  getChildElements().next();
            SOAPElement soapElement = (SOAPElement) nextSoapBodyElement.
                                      getChildElements().next();
            System.out.println("soapElement print: " + soapElement.getLocalName() +
                               "  " + soapElement.getValue());
        } catch (SOAPException e) {
            throw new JAXRPCException(e);
        }
 
        return true;
    }
 

// 返回soap应答消息,本例修改soap文件头的值再返传给客户端.
    public boolean handleResponse(MessageContext msgContext) {
 
        try {
            SOAPMessage soapMessage = ((SOAPMessageContext) msgContext).
                                      getMessage();
            SOAPHeader soapHeader = soapMessage.getSOAPHeader();
 
            SOAPBody soapBody = soapMessage.getSOAPBody();
            SOAPBodyElement soapBodyElement = (SOAPBodyElement) soapBody.
                                              getChildElements().next();
            String rpcName = soapBodyElement.getElementName().getLocalName();
 
                SOAPFactory soapFactory = SOAPFactory.newInstance();
                Name headerName = soapFactory.createName("headerMsg", "ns","http://handler");
                SOAPHeaderElement she = soapHeader.addHeaderElement(headerName);
                she.setValue("return header message");
 
        } catch (SOAPException e) {
            throw new JAXRPCException(e);
        }
 
        return true;
    }
 
 
}

用于生成布署描述符的WSTOOLS工具的配置文件:
<configuration xmlns="http://www.jboss.org/jbossws-tools"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://www.jboss.org/jbossws-tools http://www.jboss.org/jbossws-tools/schema/jbossws-tool_1_0.xsd">
  <java-wsdl>
    <service name="TestService" style="rpc" endpoint="handler.HandlerServiceInterface1">
 
      <operation name="testInOutHeader">
        <parameter type="java.lang.String"/>
        <parameter type="java.lang.String"/>
      </operation>
 
    </service>
    <namespaces target-namespace="http://handler" type-namespace="http://handler"/>
    <mapping file="HandlerServiceInterface1.xml"/>
    <webservices servlet-link="HandlerServiceInterface1"/>
  </java-wsdl>
</configuration>

关于wstools工具的使用见j2ee web service开发(一).
在生成的webservice描述符文件中手工加入以下代码:
     <handler>
      <handler-name>CutomerHandler</handler-name>
      <handler-class>handler.CutomerHandler</handler-class>
    </handler> 用以配置处理soap消息头的类.

客户端代码:利用j2ee web serive开发(三)介绍的api不难写出saaj客户端代码就不再重复劳动了。这里只介绍JBOss ws利用DII实现soap消息头的处理,它扩展了标准jax-rpc api.
package handler;
import javax.xml.namespace.QName;
import javax.xml.rpc.Call;
import javax.xml.rpc.ParameterMode;
import javax.xml.rpc.Service;
import org.jboss.ws.Constants;
import org.jboss.ws.jaxrpc.CallImpl;
import javax.xml.rpc.ServiceFactory;
import java.util.*;
public class HandlerClient {
    public HandlerClient() {
    }
 
    public static void main(String[] args) throws Exception{
        HandlerClient handlerclient = new HandlerClient();
        handlerclient.testUnboundInOutHeader();
    }
    public void testUnboundInOutHeader() throws Exception{
        Service service = ServiceFactory.newInstance().createService(new QName("TestService"));
        CallImpl call = (CallImpl)service.createCall();
        call.setOperationName(new QName("http://handler", "testInOutHeader"));
        call.addParameter("String_1", Constants.TYPE_LITERAL_STRING, ParameterMode.IN);
        call.addParameter("String_2", Constants.TYPE_LITERAL_STRING, ParameterMode.IN);
        call.setTargetEndpointAddress("http://hechang:8082/customer-handler/services/HandlerServiceInterface1");
        QName xmlName = new QName("http://handler", "headerMsg");
        // xmlName = new QName("http://otherns", "HeaderValue");
 
        call.addUnboundHeader(xmlName, Constants.TYPE_LITERAL_STRING, String.class, ParameterMode.IN);
        call.setUnboundHeaderValue(xmlName, " IN header message");
// 设置消息头 可以设定多组
        Object retObj = call.invoke(new Object[]{"Hello world!", "IN header message"});
       
        String unboundRet = (String)call.getUnboundHeaderValue(xmlName);
       // 处理返回的消息头的值
        System.out.println(" unboundReturn: "+unboundRet);
}
 
} 
分享到:
评论

相关推荐

    soap1.1和soap1.2区别

    SOAP 1.1 和 SOAP 1.2 区别详解 ...SOAP 1.1 和 SOAP 1.2 之间的主要区别在于报头信息、SOAPAction 报头行和命名空间的变化。这些变化体现了 SOAP 协议的发展和完善,提高了协议的可读性和可扩展性。

    IP数据报头模拟分析程序

    报头字段分析部分将输入的 IP 数据报头解析成各个字段,输出处理部分将这些字段值以点分十进制形式输出。 三、报头字段分析 报头字段分析是模拟分析程序的核心部分。该部分将输入的 IP 数据报头解析成各个字段,并...

    HTTP 请求报头详解

    报头字段可以分为四类:general-header、request-header、response-header 和 entity-header。 首先,general-header 字段是 request 和 response 都可用的,但是不能用于 entity。这些字段提供了关于报头的基本...

    HTTP协议之消息报头

    #### 报头域结构与特点 报头域由名字、冒号和空格、以及值三部分构成。值得注意的是,报头域的名字在HTTP中是大小写不敏感的,这意味着`Cache-Control`和`cache-control`会被视为相同。 #### 普通报头 普通报头...

    IP数据报头模拟分析程序报告.rar

    以下是一些与IP数据报头相关的知识点: 1. **IP数据报结构**:IP数据报由头部和数据两部分组成。头部通常包含20到60个字节,数据部分则承载上层协议(如TCP或UDP)的数据。 2. **头部字段**:IP数据报头包含多个...

    IP数据报头模拟分析程序.exe

    IP数据报头模拟分析程序.exe

    http报头for Arduino

    http报头for Arduino生成工具

    IP报头结构实验

    IP报头是Internet Protocol (IP) 数据包的一部分,它包含了用于路由选择、分片处理等关键信息。 #### 实验工具与材料 - **实验工具**: - **科来网络分析系统**:一款专业的网络数据分析软件,能够捕获并解析网络...

    无线多媒体传感器网络中一种自适应的报头压缩机制

    ### 无线多媒体传感器网络中一种自适应的报头压缩机制 #### 摘要与背景 随着物联网技术的发展,无线多媒体传感器网络(WMSNs)成为了一种重要的数据收集手段,尤其是在环境监控、智能交通系统等领域。WMSNs主要...

    基于SOAP网关的WebServices访问控制

    对于包含HTTP和XML报头的分组,SOAP网关会进一步使用XML SOAP验证机制对其进行处理。此外,在允许用户访问服务之前,SOAP网关还会与消息检查器进行通信,以执行必要的消息级安全检查,如确认用户的访问权限等。 ###...

    delphi操作IdHTTP报头读写

    3. 遍历所有报头:如果需要处理所有报头,可以遍历Headers属性的Fields集合: ```delphi for Header in IdHTTP.Response.Headers.Fields do Writeln(Header.Name + ': ' + Header.Value); ``` 更高级的使用场景,...

    编写计算机程序,实现点分十进制的IP地址标识方法》,要求是“从IP数据报头中取出源和目的地址,将它们以点分十进制表示输出”

    在提供的代码中,程序的目的是从IP数据报头中提取源和目的地址,并以点分十进制的形式输出。这个程序主要包含两个函数:`getid` 和 `main`。 `getid` 函数的作用是将一个32位的二进制数组转换为点分十进制的IP地址...

    移动IPv6(报头和工作流程)

    该ppt是关于移动IPv6的一个经典描述,包括其报头和基本的工作流程

    UDP 报头结构 - Wireshark 数据包分析实战(第 3 版) - 知乎书店1

    UDP(User Datagram Protocol)是一种无连接的、不可靠的传输层协议,与TCP(Transmission Control Protocol)相比,它的设计更为简单,主要用于对实时性要求较高的应用,例如语音通话、视频会议和在线游戏等。...

    IPv4与IPv6报头格式对比解析

    内容概要:本文详细对比介绍了IPv4与IPv6两种IP协议的不同之处及其各自的报头结构,涵盖版本信息、头部长度和服务类型等多项关键字段。针对IPv6的特性,深入讲解新格式所带来的安全性增强,规范性和转发效率优化等...

    关于TCP/IP消息报头

    - 实体报头与请求和响应中的实体内容有关,如`Content-Type`指定数据类型,`Content-Length`给出实体内容的长度,`Last-Modified`指示资源的最后修改时间,`Expires`设置缓存过期时间,`Allow`列出资源支持的方法...

    ip、tcp、udp_报头结构体分析.pdf

    **源、目标端口号字段**:与TCP相同,用于标识通信双方的应用进程。 **长度字段**:16比特,指示整个UDP数据报的长度,包括头部和数据部分。 **校验和字段**:16比特,为可选字段,用于校验UDP数据报的完整性,...

    IPV6 数据(含逐跳选项扩展报头)

    IPV6 数据(含逐跳选项扩展报头)

Global site tag (gtag.js) - Google Analytics