java - 使用 Axis 客户端 API 时,将 HTTP header 添加到未调用的 HTTP 请求的处理程序

标签 java http httphandler axis

我正在使用 Axis API 访问 Axis HTTP 服务器。 可以找到 API 的文档 here .

我正在使用以下代码向服务器添加处理程序。 service 是 java.xml.rpc.Service 类型

    HandlerRegistry registry = service.getHandlerRegistry();
    QName serviceName = new QName(url, "MyServiceClass");

    List<HandlerInfo> handlerChain = new ArrayList<HandlerInfo>();
    HandlerInfo handlerInfo = new HandlerInfo(MyHandler.class, null, null);
    handlerChain.add(handlerInfo);
    registry.setHandlerChain(serviceName, handlerChain);

我知道服务名称是正确的,因为我在对服务对象的后续调用中获得了正确的输出。

不知何故,处理程序没有被调用。这是处理程序类。 我的意图是在将请求转发到服务器之前向 HTTP 请求添加自定义 header

import javax.xml.namespace.QName;
import org.apache.axis.AxisFault;
import org.apache.axis.MessageContext;
import org.apache.axis.handlers.BasicHandler;

public class MyHandler extends BasicHandler {

    @Override
    public void init() {
        System.out.println("init called");
        super.init();
        System.out.println("init called");
    }

    @Override
    public void cleanup() {
        super.cleanup();
        System.out.println("cleanup called");
    }

    @Override
    public void invoke(MessageContext mc) throws AxisFault {
        System.out.println("invoke called");
    }

    public QName[] getHeaders() {
        System.out.println("getHeaders");
        return new QName[1];
    }
}

上面的代码有什么问题?

还有其他方法可以使用 Apache Axis API 修改 HTTP header 吗?

最佳答案

好的。这应该可以解决问题:

1 - 创建一个 wsdd 文件(例如 /tmp/test.wsdd),其中包含:

<deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
 <handler name="test" type="java:axistest.TestHandler" />
 <transport name="http" pivot="java:org.apache.axis.transport.http.HTTPSender">
   <requestFlow>
    <handler type="test"/>
   </requestFlow>
 </transport>
</deployment>

2 - 确保所有 Axis 库都在您的类路径中,然后运行:

java org.apache.axis.utils.Admin client /tmp/test.wsdd

3 - 第 2 步将生成一个 client-config.wsdd。将其复制到您的项目,并确保在项目运行时它位于类路径中。

4 - 所有网络服务调用(通过 Http 传输)将通过 TestHandler1 类路由

这是我的 TestHandler1 类(对您的处理程序稍作修改以访问 MIME header ):

package axistest;

import javax.xml.namespace.QName;
import javax.xml.soap.MimeHeaders;
import org.apache.axis.AxisFault;
import org.apache.axis.MessageContext;
import org.apache.axis.handlers.BasicHandler;

public class TestHandler1 extends BasicHandler {

@Override
public void init() {
    System.out.println("init called");
    super.init();
    System.out.println("init called");
}

@Override
public void cleanup() {
    super.cleanup();
    System.out.println("cleanup called");
}

@Override
public void invoke(MessageContext mc) throws AxisFault {
    System.out.println("invoke called");
    System.out.println("=----------------------------------=");
    MimeHeaders mimeHeaders = mc.getMessage().getMimeHeaders();
    mimeHeaders.addHeader("X-Test", "Hello");
    System.out.println("Headers : \n " + mimeHeaders);
}

public QName[] getHeaders() {
    System.out.println("getHeaders");
    return new QName[1];
}

}

当我在我的盒子上运行它时,我看到正在调用这些处理程序方法:

- Unable to find required classes (javax.activation.DataHandler and javax.mail.internet.MimeMultipart). Attachment support is disabled.
init called
init called
invoke called
=----------------------------------=
Headers : 
 org.apache.axis.message.MimeHeaders@761eec35
.
.
.

关于java - 使用 Axis 客户端 API 时,将 HTTP header 添加到未调用的 HTTP 请求的处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3925272/

相关文章:

java - https到http重写、https检测、java spring mvc

c# - 通过 HTTP 处理程序连接到 SQL Server Express 数据库

seo - 所有搜索引擎都接受 sitemap.axd 吗?

java - 为什么使用工厂而不是 'new' ?

java - 如何将 CSV 文件字符串显示为带有换行标记的 HTML?

java - #if 在 Java 中,就像在 C 预处理器中一样

java - 如何在 ListView 中获取所选项目的值 - Android

python - 在 Selenium 中捕获流量

java - 网页上的 "pressing a button"使用 "GET"和 java

java - java HttpServer 类向/从 java HttpHandler 类传递数据的正确方法