IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Services Web Java Discussion :

[AXIS] Modifier header HTTP / Utilisation du MessageContext


Sujet :

Services Web Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Inscrit en
    Août 2009
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 20
    Par défaut [AXIS] Modifier header HTTP / Utilisation du MessageContext
    Bonjour à tous,

    J'ai un client qui doit se connecter à un WS utilisant un systeme de HTTP Basic Authentication.

    Pour cela je dois ajouter dans le header HTTP de ma requête un login/mdp.


    1) Est-il possible de modifier le header sans utiliser son propre handler ?

    Je construis donc un header comme indiquer sur ce site ici

    Voila un le morceau de mon code concerner :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    MonService service = new MonServiceLocator();
     
    try {
     
    MessageFactory messageFactory = MessageFactory.newInstance();
    SOAPMessage message = messageFactory.createMessage();
    javax.xml.soap.MimeHeaders hd = message.getMimeHeaders();
    String username="";
    String password="";
    String authorization = Base64.encode((username + ":" + password).getBytes());
    hd.addHeader("Authorization", "Basic " + authorization);
     
     
    port = service.getMonPort();
    responseMsg = port.getParamQualif(msg);
    		} catch (){
    	}
    2) Comment puis-je maintenant setter mon header a ma requette ? Autrement dit comment récupérer mon SOAPMessage ?



    J'aimerai aussi réussir à afficher le header, pour cela je pense utiliser le MessageContext mais je trouve très peu d'exemple exploitable sur le net de son utilisation et la javadoc n'est pas très bavarde ....

    3) Quelqu'un sait-il ou l'on peut trouver un tuto, un exemple, une description ou quoi que se soit expliquant le fonctionnement de se MessageContext ?


    Merci pour toute aide sur un des ces 3 points

  2. #2
    Membre actif
    Inscrit en
    Août 2009
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 20
    Par défaut
    Un petit mots pour signaler qu'en se Lundi matin ces questions sont toujours d'actualités et donc tous indice est le bienvenue

  3. #3
    Membre confirmé
    Femme Profil pro
    Développeur Java
    Inscrit en
    Juin 2004
    Messages
    167
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 50
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 167
    Par défaut
    3 possibilités :
    Soit tu fais comme dans ton exemple en positionnant les MimeHeaders sur ton objet message, mais dans ce cas il faut completer cet objet message avec l'enveloppe SOAP et l'envoyer vers ton WS : call.invoke(message)

    Soit tu utilises ton client stub (c'est ce que tu as l'air de faire avec port.getParamQualif(msg) si je comprend bien) et dans ce cas il faut utiliser une autre méthode et légerement modifier ton stub, il existe une constante HEADER_AUTHORIZATION, je ne l'ai jamais utiliser mais ca devrait correspondre a ce que tu veux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    _call.setProperty(org.apache.axis.transport.http.HTTPConstants.HEADER_AUTHORIZATION, "xxxxxxxxxxxxx");
    Enfin le meilleur pour la fin, il me semble que l'objet MessageContext permet de faire ce que tu souhaites grace a :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    MessageContext msgContext = _call.getMessageContext();
    msgContext.setUsername("username");
    msgContext.setPassword("password");

  4. #4
    Membre actif
    Inscrit en
    Août 2009
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 20
    Par défaut
    Tous d'abord merci Felix79 pour ta réponse grâce à tes indications maintenant ça marche !!!

    A partir de mon client générer automatiquement, il faut modifier dans son stub (ex monServiceBindingStub) la fonction qui se charge de faire l'appel (_call).


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
     
    // Dans ma classe effectuant l'appel au WS
     
    MonService service = new MonServiceLocator();
    try{
    port = service.getMonServicePort();
    responseMsg = port.getParam(msg);
    }
     
    // Dans mon stub 
     
    public getParam(Msg body) throws java.rmi.RemoteException {
     
                     org.apache.axis.client.Call _call = createCall();
    		_call.setOperation(_operations[0]);
    		_call.setUseSOAPAction(true);
    		_call.setSOAPActionURI("...");
    		[...]
     
    		_call.setUsername("username");
    		_call.setPassword("password");
     
    		setRequestHeaders(_call);
    		setAttachments(_call);
    		try {        java.lang.Object _resp = _call.invoke(new java.lang.Object[] {body});
    }catch(){...}

    Dans le cas d'un webservice fournissant plusieurs services, je pense que mettre le password et le user dans le createCall() est judicieux.


    La première solution créant le message de toutes pièces est effectivement plus laborieuse, en revanche elle permet de bien comprendre comment cela se passe.

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2007
    Messages : 11
    Par défaut Ajouter un Header SOAP vs un Header HTTP à partir d'un stub Axis2
    Bonjour,

    => Pour ajouter un header SOAP à un service Web en utilisant le code stub généré par Axis2

    MonStub clientStub = new MonStub(...);
    ServiceClient serviceClient = clientStub._getServiceClient();
    QName qname = new QName("namespaceURI","localPart","prefix");
    serviceClient.addStringHeader(qname, "valeur");

    => Pour ajouter un header HTTP à un service Web en utilisant le code stub généré par Axis2

    Premièrement, il faut un objet MessageContext (non null) par exemple vous pouvez modifier le code stub code (par exemple MonStub.java) en utilisant la méthode addHttpHeader

    this.addHttpHeader(_messageContext, "nom de votre header", "la valeur de votre header");

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Récupèrer un header http et le modifier
    Par byakuichi dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 06/11/2010, 10h25
  2. [Axis] Headers HTTP
    Par getupa dans le forum Services Web
    Réponses: 4
    Dernier message: 28/06/2010, 14h41
  3. Cannot modify header information
    Par rane dans le forum Langage
    Réponses: 5
    Dernier message: 29/03/2006, 14h32
  4. Warning: Cannot modify header information
    Par neXistPa dans le forum Langage
    Réponses: 9
    Dernier message: 16/02/2006, 12h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo