处理程序将HTTP标头添加到使用Axis Client API时未调用的HTTP请求

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

我使用以下代码将处理程序添加到服务器。 service的类型为java.xml.rpc.Service

  HandlerRegistry registry = service.getHandlerRegistry(); QName serviceName = new QName(url, "MyServiceClass"); List handlerChain = new ArrayList(); HandlerInfo handlerInfo = new HandlerInfo(MyHandler.class, null, null); handlerChain.add(handlerInfo); registry.setHandlerChain(serviceName, handlerChain); 

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

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

 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标头?

Okie。 这应该是诀窍:

1 – 创建一个包含以下内容的/tmp/test.wsdd文件(例如/tmp/test.wsdd ):

         

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

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

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

4 – 所有Web服务调用(通过Http传输)将通过TestHandler1类进行路由

这是我的TestHandler1类(稍微修改了访问MIME头的ur处理程序):

 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 . . . 

关于Handlers用法的BTW阅读,我找到了这个页面。 看看它是否有帮助: http : //soa.sys-con.com/node/39721

我们正在向SOAP请求添加自定义标头。 但是,我们通过在运行时将头部注入Web服务的Axis Stub对象来实现此目的。 因此,它们不会针对每个请求进行更改,但是注入的标头用于我们测试用例的整个运行

如果您认为这也是您的用例,我可以找到该代码并使用我们所做的更新。