2010-10-13 25 views
6

J'utilise l'API Axis pour accéder au serveur HTTP Axis. La documentation de l'API peut être trouvée here. J'utilise le code suivant pour ajouter des gestionnaires au serveur. service est de type java.xml.rpc.ServiceGestionnaire d'ajout d'en-têtes HTTP à la requête HTTP non invoqué lors de l'utilisation de l'API Axis Client

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); 

Je sais que le nom de service est correct que je reçois la sortie correcte dans les appels suivants à l'objet de service.

D'une certaine manière, le gestionnaire n'est pas appelé. Voici la classe Handler. Mon intention est de ajouter des en-têtes personnalisés à la requête HTTP avant de transmettre la demande au serveur.

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

Quel est le problème avec le code ci-dessus?

Existe-t-il un autre moyen de modifier les en-têtes HTTP à l'aide de l'API Apache Axis?

Répondre

7

Okie. Cela devrait faire l'affaire:

1 - Créez un fichier WSDD (par exemple /tmp/test.wsdd) contenant ceci:

<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 - Assurer tous les axes libs sont dans votre chemin de classe et puis exécutez:

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

3 - L'étape 2 génère un client-config.wsdd. Copiez ceci dans votre projet et assurez-vous qu'il se trouve dans le chemin de la classe lors de l'exécution du projet.

4 - Tous les appels WebService (via le transport Http) sera l'itinéraire via la classe TestHandler1

Voici ma classe TestHandler1 (une légère modification de ur gestionnaire pour accéder aux en-têtes 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]; 
} 

} 

quand je l'exécute sur ma boîte, je vois que ces méthodes de gestionnaire sont invoquées:

- 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

cela fonctionne pour moi. avec mon client-config.wsdd Heureusement, cet outil génère le bon fichier –

+0

Cela fonctionne pour moi! Merci! – jilt3d

0

Nous ajoutons des en-têtes personnalisés à une requête SOAP. Cependant, nous l'avons implémenté en injectant les en-têtes dans l'objet Axis Stub pour le webservice lors de l'exécution. Ainsi, ils ne changent pas pour chaque requête, mais les en-têtes injectés sont utilisés pour la totalité de nos tests.

Si vous pensez que c'est aussi votre cas d'utilisation, je peux trouver ce code et mettre à jour avec ce que nous avons fait.

+0

Je dois ajouter des en-têtes HTTP et non des en-têtes SOAP. –

+0

Désolé :(Néanmoins, j'ai fait une recherche pour trouver ceci. S'il vous plaît vérifiez si cela aide: http://faq.javaranch.com/java/WebServicesHowTo#http-headers – madhurtanwani

+0

en essayant d'appeler la fonction setProperty sur l'objet stub. Cela ne fonctionne pas.Pouvez-vous s'il vous plaît me donner l'extrait de code que vous utilisez? Merci –