2010-10-13 79 views
6

我正在使用Axis API访问Axis HTTP服务器。 该API的文档可以找到here使用Axis客户端API时未将HTTP头添加到HTTP请求的处理程序

我正在使用以下代码将处理程序添加到服务器。 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); 

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

不知何故处理程序没有被调用。这是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头?

回答

7

Okie。这应该做的伎俩:

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 - 确保所有轴库都在类路径中,然后运行:

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

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

4 - 所有的web服务呼叫(通过HTTP传输)通过TestHandler1类

这里是我TestHandler1类(UR处理程序的轻微修改访问MIME头)将路由:

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 : 
[email protected] 
. 
. 
. 
+0

这对我有用。用我的client-config.wsdd。谢天谢地这个工具生成正确的文件。 – 2010-10-21 09:13:20

+0

它正在为我工​​作!谢谢! – jilt3d 2012-04-14 13:32:05

0

我们正在为SOAP请求添加自定义标头。但是,我们通过在运行时将头部注入Web服务的Axis Stub对象来实现此目的。因此,它们不会因为每个请求而改变,但注入的头文件用于我们测试用例的整个运行。如果您认为这也是您的用例,那么我可以找到该代码并使用我们所做的更新进行更新。

+0

我需要添加HTTP标头而不是SOAP标头。 – 2010-10-17 13:04:40

+0

对不起:(。然而,我做了一个搜索找到这个。请检查是否有帮助:http://faq.javaranch.com/java/WebServicesHowTo#http-headers – madhurtanwani 2010-10-20 14:00:36

+0

试图调用存根对象的setProperty函数。它不起作用,你能给我你正在使用的代码片段吗? 谢谢 – 2010-10-21 04:41:05

相关问题