2010-10-13 16 views
6

Sto utilizzando l'API Axis per accedere al server HTTP Axis. La documentazione dell'API può essere trovata here.Gestore per aggiungere intestazioni HTTP alla richiesta HTTP non invocata quando si utilizza l'API client Axis

Sto usando il seguente codice per aggiungere gestori al server. service è di tipo 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); 

So che il nome del servizio è corretto come sto ottenendo l'output corretto nelle successive chiamate al servizio oggetto.

In qualche modo il gestore non viene richiamato. Ecco la classe dell'handler. La mia intenzione è di aggiungere intestazioni personalizzate alla richiesta HTTP prima di inoltrare la richiesta al server.

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]; 
    } 
} 

Cosa c'è di sbagliato nel codice sopra?

C'è un altro modo per modificare le intestazioni HTTP usando Apache Axis API?

risposta

7

Okie. Questo dovrebbe fare il trucco:

1 - Creare un file WSDD (diciamo /tmp/test.wsdd) che contiene questo:

<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 - Assicurarsi che tutti gli assi librerie sono nel vostro percorso di classe e quindi eseguire:

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

3 - Il passaggio 2 genererà un client-config.wsdd. Copia questo nel tuo progetto e assicurati che si trovi nel percorso della classe quando viene eseguito il progetto.

4 - tutte le chiamate webservice (con i mezzi HTTP) percorso sarà tramite la classe TestHandler1

Qui è la mia classe TestHandler1 (una leggera modifica del ur gestore per accedere alle intestazioni 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]; 
} 

} 

quando eseguo questo sulla mia scatola, vedo che questi metodi di gestore vengono invocati:

- 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

questo funziona per me. con il mio client-config.wsdd. Per fortuna questo strumento genera il file corretto. –

+0

Funziona per me! Grazie! – jilt3d

0

Stiamo aggiungendo intestazioni personalizzate a una richiesta SOAP. Tuttavia, lo abbiamo implementato iniettando le intestazioni nell'oggetto Stub di Axis per il webservice in fase di runtime. Quindi, non cambiano per ogni richiesta, ma le intestazioni iniettate vengono utilizzate per l'intera esecuzione dei nostri casi di test

Se pensi che sia anche il tuo caso d'uso, posso trovare quel codice e aggiornarlo con quello che abbiamo fatto.

+0

Ho bisogno di aggiungere intestazioni HTTP e non intestazioni SOAP. –

+0

Spiacente :(Tuttavia, ho fatto una ricerca per trovare questo. Controlla se aiuta: http://faq.javaranch.com/java/WebServicesHowTo#http-headers – madhurtanwani

+0

cercando di chiamare la funzione setProperty sull'oggetto stub. Non funziona. Puoi darmi lo snippet di codice che stai utilizzando? Grazie –

Problemi correlati