• 十二、用Axis操作 Header头部信息


    Axis中操作Header的信息是通过Handler来完成的,在读取Header的信息的时候,可以完成Header的操作的Handler有JWSHandler、SOAPMonitorHandler、JAXRPCHandler。JWSHandler是完成jws发布模式的WebService的Header的读取操作,

    SOAPMonitorHandler是完成SOAPMonitor模式的,JAXRPCHandler是java rpc模式的。

    下面将会用JAXRPCHandler读取客户端的Header信息,然后用BasicHandler将客户端请求的Header写入客户端的响应的Header中。

    1、 首先编写一个方法,这个方法什么也不做。就是在这个方法请求和响应的时候分别完成读取Header的信息和写入响应的Header内容。代码如下: 

    代码
    package com.hoo.service;

    /**
    * <b>function:</b>读取客户端头部Header信息的WebService
    *
    @author hoojo
    * @createDate Dec 19, 2010 11:33:25 AM
    * @file ReadHeaderService.java
    * @package com.hoo.service
    * @project AxisWebService
    * @blog
    http://blog.csdn.net/IBM_hoojo
    * @email hoojo_@126.com
    *
    @version 1.0
    */
    public class OperaterHeaderService {
    /**
    * <b>function:</b>提供一个空方法,在调用这个方法的时候
    * 触发ReadHeaderHandler读取Header的信息
    *
    @author hoojo
    * @createDate Dec 19, 2010 11:33:54 AM
    */
    public void readHeader() {
    }
    }

    2、 客户端的Header中的内容是下面这样的xml内容

    代码
    <ns1:Header soapenv:mustUnderstand="0" xmlns:ns1="soap">
    <ServiceName>ReadHeaderService</ServiceName>
    <CreateDate>2010-12-19T06:22:59.931Z</CreateDate>
    <ns2:Version xmlns:ns2="service">1.0</ns2:Version>
    <author>
    <name>axis</name>
    <age>14</age>
    </author>
    <copyRight>
    <year>2010</year>
    <number>123123123</number>
    </copyRight>
    <Tel>555666442</Tel>
    </ns1:Header>

    下面将用客户端代码将上面的xml元素添加的Header中,代码如下:

    代码
    /** 添加请求的header */
    //父节点,根节点
    SOAPHeaderElement el = new SOAPHeaderElement(new QName("soap", "Header"));
    //文本节点
    MessageElement msgEl = new MessageElement(new QName("ServiceName"), "ReadHeaderService");
    el.addChild(msgEl);

    //文本节点
    el.addChild(new MessageElement(new QName("CreateDate"), new Date()));
    el.addChild(
    new MessageElement(new QName("service", "Version"), "1.0"));
    //子元素
    msgEl = new MessageElement(new QName("author"));
    msgEl.addChild(
    new MessageElement(new QName("name"), "axis"));
    msgEl.addChild(
    new MessageElement(new QName("age"), "14"));
    el.addChild(msgEl);
    //子元素
    msgEl = new MessageElement(new QName("copyRight"));
    msgEl.addChild(
    new MessageElement(new QName("year"), "2010"));
    msgEl.addChild(
    new MessageElement(new QName("number"), "123123123"));
    el.addChild(msgEl);
    el.addChild(
    new MessageElement(new QName("Tel"), "555666442"));
    System.out.println(el.toString());
    //设置请求的header
    call.addHeader(el);

    上面的就完成了xml中的内容,并且添加到请求的Header中。

    3、 根据上面的Header的内容,我们现在编写一个Handler用来读取客户端请求信息中的Header的内容,这个Handler需要继承JAXRPCHandler。代码如下:

    代码
    package com.hoo.service.handler;

    import java.util.Iterator;
    import java.util.List;
    import javax.xml.soap.SOAPHeader;
    import org.apache.axis.AxisFault;
    import org.apache.axis.MessageContext;
    import org.apache.axis.handlers.JAXRPCHandler;
    import org.apache.axis.message.MessageElement;
    import org.apache.axis.message.NodeImpl;
    import org.apache.axis.message.SOAPHeaderElement;
    import org.apache.axis.message.Text;
    /**
    * <b>function:</b>读取Header信息的Handler
    *
    @author hoojo
    * @createDate Dec 19, 2010 11:34:56 AM
    * @file ReadHeaderHandler.java
    * @package com.hoo.service.handler
    * @project AxisWebService
    * @blog
    http://blog.csdn.net/IBM_hoojo
    * @email hoojo_@126.com
    *
    @version 1.0
    */
    public class ReadHeaderHandler extends JAXRPCHandler {

    private static final long serialVersionUID = -546314372478633248L;

    @SuppressWarnings(
    "unchecked")
    @Override
    public void invoke(MessageContext msgContext) throws AxisFault {
    try {
    //头对象
    SOAPHeader header = msgContext.getCurrentMessage().getSOAPHeader();
    Iterator
    <SOAPHeaderElement> iter = header.getChildElements();
    while (iter.hasNext()) {
    //子元素
    SOAPHeaderElement el = iter.next();
    //继续子元素
    List<NodeImpl> list = el.getChildren();
    for (NodeImpl node : list) {
    if (node.hasChildNodes()) {
    MessageElement msg
    = (MessageElement) node;
    if (msg.hasChildNodes()) {
    List
    <NodeImpl> msgNode = msg.getChildren();
    for (NodeImpl n : msgNode) {
    if (!n.hasChildNodes()) {
    Text text
    = (Text) n;
    System.out.println(
    "父节点:" + el.getName() + ", 节点:" + msg.getName() + ", 值:" + text.getValue());
    }
    else {
    MessageElement child
    = (MessageElement) n;
    if (child.hasChildNodes()) {
    List
    <NodeImpl> childNode = child.getChildren();
    for (NodeImpl n2 : childNode) {
    if (!n2.hasChildNodes()) {
    Text text
    = (Text) n2;
    System.out.print(
    "父父节点:" + el.getName() + ", 父节点:" + msg.getName());
    System.out.println(
    ", 节点:" + child.getName() + "##" + child.getNodeName()
    + ", 值:" + text.getValue() + "##" + child.getValue());
    }
    }
    }
    }
    }
    }
    }
    }
    }
    }
    catch (Exception e) {
    e.printStackTrace();
    }
    }
    }

    上面读取Header内容的代码有点小长,不过比较简单。就是用循环遍历Header的内容,Header的内容是一个xml的文档。所以用循环一步步向里面遍历,不过感觉写个递归会更简单。

    4、 下面将编写一个Handler来向客户端的Response中写入Header内容,写入的Header的内容就是客户端请求的Header内容。代码如下:

    代码
    package com.hoo.service.handler;

    import java.util.Iterator;
    import javax.xml.soap.SOAPException;
    import org.apache.axis.AxisFault;
    import org.apache.axis.Message;
    import org.apache.axis.MessageContext;
    import org.apache.axis.handlers.BasicHandler;
    import org.apache.axis.message.SOAPEnvelope;
    import org.apache.axis.message.SOAPHeader;
    import org.apache.axis.message.SOAPHeaderElement;

    /**
    * <b>function:</b>用handler向客户端写入Response 的Header信息
    *
    @author hoojo
    * @createDate Dec 19, 2010 2:08:35 PM
    * @file WriteHeaderHandler.java
    * @package com.hoo.service.handler
    * @project AxisWebService
    * @blog
    http://blog.csdn.net/IBM_hoojo
    * @email hoojo_@126.com
    *
    @version 1.0
    */
    public class WriteHeaderHandler extends BasicHandler {

    private static final long serialVersionUID = 1L;

    @SuppressWarnings(
    "unchecked")
    public void invoke(MessageContext msgContext) throws AxisFault {
    Message msg
    = msgContext.getCurrentMessage();
    SOAPEnvelope se
    = msg.getSOAPEnvelope();

    //request Header的部分头信息
    Message reqMsg = msgContext.getRequestMessage();
    SOAPEnvelope reqSe
    = reqMsg.getSOAPEnvelope();
    SOAPHeader reqHeader
    = null;
    try {
    reqHeader
    = (SOAPHeader) reqSe.getHeader();
    }
    catch (SOAPException e) {
    e.printStackTrace();
    }

    //response Header部分头信息
    Message respMsg = msgContext.getResponseMessage();
    SOAPEnvelope respSe
    = respMsg.getSOAPEnvelope();
    SOAPHeader respHeader
    = null;
    try {
    respHeader
    = (SOAPHeader) respSe.getHeader();
    }
    catch (SOAPException e) {
    e.printStackTrace();
    }

    Iterator
    <SOAPHeaderElement> iter = reqHeader.examineAllHeaderElements();
    while (iter.hasNext()) {
    SOAPHeaderElement she
    = iter.next();
    try {
    //添加请求信息到响应的Header中
    respHeader.addChildElement(she);
    }
    catch (SOAPException e) {
    e.printStackTrace();
    }
    System.out.println(she.getNodeName());
    }
    //设置响应信息
    msgContext.setResponseMessage(respMsg);
    try {
    System.out.println(
    "header Info:" + se.getHeader());
    }
    catch (SOAPException e) {
    e.printStackTrace();
    }
    }
    }

    上面的代码是取出respHeader = (SOAPHeader) respSe.getHeader();

    然后循环遍历Header的元素写入到respHeader.addChildElement(she);

    5、 好了,上面已经写好了WebService的方法,以及请求时读取Header内容的Handler和在响应时写入Header内容的Handler。下面开始写wsdd发布当前WebService。

    代码
    <?xml version="1.0" encoding="UTF-8"?>
    <deployment xmlns="http://xml.apache.org/axis/wsdd/"
    xmlns:java
    ="http://xml.apache.org/axis/wsdd/providers/java">
    <handler name="ReadHeaderHandler" type="java:com.hoo.service.handler.ReadHeaderHandler"/>
    <handler name="WriteHeaderHandler" type="java:com.hoo.service.handler.WriteHeaderHandler"/>

    <service name="OperaterHeader" provider="java:RPC">
    <requestFlow>
    <handler type="ReadHeaderHandler"/>
    </requestFlow>
    <parameter name="className" value="com.hoo.service.OperaterHeaderService" />
    <parameter name="allowedMethods" value="*" />
    <parameter name="scope" value="request" />
    <responseFlow>
    <handler type="WriteHeaderHandler"/>
    </responseFlow>
    </service>
    </deployment>

    还是用doc命令发布当前WebService,命令如下:

    C:\SoftWare\tomcat-5.0.28\tomcat-5.0.28\webapps\AxisWebService\WEB-INF>java -Djava.ext.dirs=lib org.apache.axis.client.AdminClient -lhttp://localhost:8080/AxisWebService/services/AdminService deployHeader.wsdd

    发布完成后,你会看的

    Processing file deployHeader.wsdd

    <Admin>Done processing</Admin>

    的字样就表示发布成功了,然后在浏览器地址栏输入:

    http://localhost:8080/AxisWebService/servlet/AxisServlet

    你就可以看到OperaterHandler这个WebService了

    6、 OperaterHandler这个WebService成功发布,现在就是要编写客户端代码调用这个WebService,客户端代码比较简单,完整代码如下:

    代码
    package com.hoo.client;

    import java.rmi.RemoteException;
    import java.util.Date;
    import javax.xml.namespace.QName;
    import javax.xml.rpc.ServiceException;
    import javax.xml.soap.SOAPException;
    import org.apache.axis.Message;
    import org.apache.axis.client.Call;
    import org.apache.axis.client.Service;
    import org.apache.axis.message.MessageElement;
    import org.apache.axis.message.SOAPEnvelope;
    import org.apache.axis.message.SOAPHeaderElement;

    /**
    * <b>function:</b>Header操作WebService客户端
    *
    @author hoojo
    * @createDate Dec 19, 2010 2:18:51 PM
    * @file OperaterHeaderClient.java
    * @package com.hoo.client
    * @project AxisWebService
    * @blog
    http://blog.csdn.net/IBM_hoojo
    * @email hoojo_@126.com
    *
    @version 1.0
    */
    public class OperaterHeaderClient {

    public static void main(String[] args) throws SOAPException, ServiceException, RemoteException {
    String url
    = "http://localhost:8080/AxisWebService/services/OperaterHeader";
    //创建服务
    Service service = new Service();
    //创建调用句柄
    Call call = (Call) service.createCall();
    //设置请求地址
    call.setTargetEndpointAddress(url);
    call.setOperationName(
    new QName("readHeader"));

    /** 添加请求的header */
    //父节点,根节点
    SOAPHeaderElement el = new SOAPHeaderElement(new QName("soap", "Header"));
    //文本节点
    MessageElement msgEl = new MessageElement(new QName("ServiceName"), "ReadHeaderService");
    el.addChild(msgEl);

    //文本节点
    el.addChild(new MessageElement(new QName("CreateDate"), new Date()));
    el.addChild(
    new MessageElement(new QName("service", "Version"), "1.0"));
    //子元素
    msgEl = new MessageElement(new QName("author"));
    msgEl.addChild(
    new MessageElement(new QName("name"), "axis"));
    msgEl.addChild(
    new MessageElement(new QName("age"), "14"));
    el.addChild(msgEl);
    //子元素
    msgEl = new MessageElement(new QName("copyRight"));
    msgEl.addChild(
    new MessageElement(new QName("year"), "2010"));
    msgEl.addChild(
    new MessageElement(new QName("number"), "123123123"));
    el.addChild(msgEl);
    el.addChild(
    new MessageElement(new QName("Tel"), "555666442"));

    System.out.println(el.toString());
    //设置请求的header
    call.addHeader(el);

    /**
    * 注意:在请求readHeader方法的时候,也就是invoke执行的时候。会调用ReadHeaderHandler这个handler
    * 在请求完成后,准备返回值的时候或是说函数在运行完成了后。就会触发WriteHeaderHandler
    */
    call.invoke(
    new Object[] {});

    /** 响应的header */
    Message msg
    = call.getResponseMessage();
    SOAPEnvelope se
    = msg.getSOAPEnvelope();
    System.out.println(
    "responseMessage:" + se.getHeader());
    }
    }

    call.getResponseMessage();可以得到服务器响应的Header的信息

    运行后你可以看到客户端控制台会输出:

    <ns1:Header soapenv:actor="http://schemas.xmlsoap.org/soap/actor/next" soapenv:mustUnderstand="0" xmlns:ns1="soap" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><ServiceName xsi:type="xsd:string" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">ReadHeaderService</ServiceName><CreateDate xsi:type="xsd:dateTime" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">2010-12-19T06:22:59.931Z</CreateDate><ns2:Version xsi:type="xsd:string" xmlns:ns2="service" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">1.0</ns2:Version><author><name xsi:type="xsd:string" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">axis</name><age xsi:type="xsd:string" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">14</age></author><copyRight><year xsi:type="xsd:string" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">2010</year><number xsi:type="xsd:string" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">123123123</number></copyRight><Tel xsi:type="xsd:string" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">555666442</Tel></ns1:Header>

    responseMessage:<soapenv:Header xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><ns1:Header soapenv:actor="http://schemas.xmlsoap.org/soap/actor/next" soapenv:mustUnderstand="0" xmlns:ns1="soap"><ServiceName xsi:type="soapenc:string" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">ReadHeaderService</ServiceName><CreateDate xsi:type="xsd:dateTime" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">2010-12-19T06:22:59.931Z</CreateDate><ns2:Version xsi:type="soapenc:string" xmlns:ns2="service" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">1.0</ns2:Version><author><name xsi:type="soapenc:string" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">axis</name><age xsi:type="soapenc:string" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">14</age></author><copyRight><year xsi:type="soapenc:string" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">2010</year><number xsi:type="soapenc:string" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">123123123</number></copyRight><Tel xsi:type="soapenc:string" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">555666442</Tel></ns1:Header></soapenv:Header>

    responseMessage前面的内容是客户端将会写入到Header中的xml内容,而responseMessage后面的内容就是响应的Header的内容,这段内容是WriteHeaderHandler写入到ResponseMessage中的。

    再看看服务器端控制台的内容:

    父节点:Header, 节点:ServiceName, 值:ReadHeaderService

    父节点:Header, 节点:CreateDate, 值:2010-12-19T06:22:59.931Z

    父节点:Header, 节点:Version, 值:1.0

    父父节点:Header, 父节点:author, 节点:name##name, 值:axis##axis

    父父节点:Header, 父节点:author, 节点:age##age, 值:14##14

    父父节点:Header, 父节点:copyRight, 节点:year##year, 值:2010##2010

    父父节点:Header, 父节点:copyRight, 节点:number##number, 值:123123123##123123123

    父节点:Header, 节点:Tel, 值:555666442

    ns1:Header

    header Info:<soapenv:Header xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><ns1:Header soapenv:actor="http://schemas.xmlsoap.org/soap/actor/next" soapenv:mustUnderstand="0" xmlns:ns1="soap"><ServiceName xsi:type="soapenc:string" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">ReadHeaderService</ServiceName><CreateDate xsi:type="xsd:dateTime" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">2010-12-19T06:22:59.931Z</CreateDate><ns2:Version xsi:type="soapenc:string" xmlns:ns2="service" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">1.0</ns2:Version><author><name xsi:type="soapenc:string" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">axis</name><age xsi:type="soapenc:string" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">14</age></author><copyRight><year xsi:type="soapenc:string" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">2010</year><number xsi:type="soapenc:string" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">123123123</number></copyRight><Tel xsi:type="soapenc:string" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">555666442</Tel></ns1:Header></soapenv:Header>

    上面的文本内容是ReadHeaderHandler读取客户端的Header的内容和我们定制的xml的内容是一致的。而后面的xml能入是WriteHeaderHandler中输出的内容。

  • 作者:hoojo
    出处:
    blog:http://blog.csdn.net/IBM_hoojo
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

版权所有,转载请注明出处 本文出自:
分享道版权所有,欢迎转载,转载请注明出处,谢谢
收藏
关注
评论
  • 相关阅读:
    android绘画折线图二
    android绘画折线图一
    jQuery Select操作大集合
    jquery事件切换hover/toggle
    jquery $(document).ready() 与window.onload的区别
    canny边缘检测 C++手动实现
    高斯核原理和C++实现
    darknet-yolov3 burn_in learning_rate policy
    UserWarning: indexing with dtype torch.uint8 is now deprecated, please use a dtype torch.bool instead
    BatchNormaliation
  • 原文地址:https://www.cnblogs.com/hoojo/p/1911396.html
  • Copyright © 2020-2023  润新知