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

 Delphi Discussion :

Changer le format dans SOAP


Sujet :

Delphi

  1. #1
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 674
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 674
    Points : 5 259
    Points
    5 259
    Par défaut Changer le format dans SOAP
    Bonjour,

    J'ai besoin de m'interfacer avec un webservice.

    Le problème c'est que le format du SOAP que j'envoie n'est pas le même que celui attendu par le webservice

    Exemple :
    <NS1:XXXXXX xmlns:NS1="http://URL/">
    doit être sous la forme
    <XXXXXX xmlns="http://URL/">

    Je cherche également à transformer ceci :
    <user_login xsi:type="xsd:string">login</user_login>
    en ceci
    <user_login>login</user_login>

    Je galère depuis le début de l'après midi.
    J'ai trouvé quelque piste mais décidemment ça veut pas marcher.
    Quelqu'un sait pourquoi le soDocument disparait à chaque fois des options ?

    Je vous remercie pour votre aide.

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Tu devrais regarder sur le EncodedType si literal ou encoded
    J'ai parfois bidouiller manuellement le buffer SOAP directement dans un objet hérité de THTTPRIO, je surchargeais DoBeforeExecute !
    Avec D7 qui ne gèrait pas le type "Any Raw XML"
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 674
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 674
    Points : 5 259
    Points
    5 259
    Par défaut
    Je n'ai trouvé nulle part de propriété EncodeType. D'ailleurs une recherche avancé dans tout le répertoire SOAP ne trouve pas "EncodedType"

    J'ai par contre trouvé "encoded" et "literal" dans les constantes "SSoapBodyUseEncoded" et "SSoapBodyUseLiteral" mais ces constantes ne sont utilisées nulle-part.

    Dois-je remplir la propriété "Encoding" du converter avec l'une de ses constantes ?
    Quelle valeur est utilisée par défaut car l'aide Delphi fait référence à une variable DefaultDOMVendor que je ne retrouve pas dans les source non plus ?

    J'avoue que je commence vraiment à patauger là !

    Edit : Si j'utilise "encoded" ou "literal" dans Converter.Encoding, la requête soap est vide.

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Oups, c'est EncodedStyle dans la WSDL
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <soap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <soap:body use="literal" />
    Je te conseil d'utiliser systèmatiquemennt le mode encoded, il est plus "stable" en tout cas, j'ai nettement moins de soucis en Delphi 7 avec ce mode !

    Pour la qualification de tes balises, j'avoue que je n'ai jamais modifié, j'ai fait ceci moi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    type
      THTTPRIO_Adapté = class(THTTPRIO)
      protected
        procedure DoBeforeExecute(const MethodName: string; Request: TStream); override; // L'Evènement OnBeforeExecute ne permet pas de modifier la Requête, un gros bug ...
      end;
    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
    procedure THTTPRIO_Adapté.DoBeforeExecute(const MethodName: string; Request: TStream);
    var
      SOAPText: string;
    begin
      if SameText(MethodName, 'TrucBidule') then
      begin
        SetLength(SOAPText, Request.Size);
     
        Request.Position := 0;
        Request.Read(SOAPText[1], Request.Size); // [1] pointe sur le buffer !
     
        SOAPText := StringReplace(SOAPText, '<Message>', '<Message xmlns="http://schemas.microsoft.com/BizTalk/2003/Any">', [rfIgnoreCase, rfReplaceAll]);
     
        Request.Position := 0;
        Request.Write(SOAPText[1], Length(SOAPText) * SizeOf(Char)); // [1] pointe sur le buffer !
      end;
    end;
    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
    function GetMachinChoseInterface(const URL: string): IMachinChoseInterface;
    // Valeur par défaut, conservé pour mémoire mais pas utilisé
    const
      defWSDL = 'https://blabla.truc?wsdl';  // ne contient pas d'url utilisable !
      defSvc  = 'rcvMachinChose';
      defPrt  = 'rcvMachinChoseInterface';
    var
      RIO: THTTPRIO;
    begin
      Result := nil;
     
      RIO := THTTPRIO_Adapté.Create(nil);
      try
        Result := (RIO as IMachinChoseInterface);
        RIO.URL := URL; // On n'utilise pas le WSDL !!!
      finally
        if Result = nil then
          RIO.Free; // Pas d'Interface, c'est le seul cas où l'on peut et surtout que l'on doit détruire explicitement l'instance de THTTPRio;
      end;
    end;
    original
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <?xml version="1.0"?>
    <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><SOAP-ENV:Body><TrucBidule xmlns="urn:censure.Passerelle.EAI"><Message><MessageTruc xmlns:censure="http://www.sante-ra.fr" xmlns="http://www.censure.fr"></MessageTruc></Message></TrucBidule></SOAP-ENV:Body></SOAP-ENV:Envelope>
    modifié
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <?xml version="1.0"?>
    <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><SOAP-ENV:Body><TrucBidule xmlns="urn:censure.Passerelle.EAI"><Message xmlns="http://schemas.microsoft.com/BizTalk/2003/Any"><MessageTruc xmlns:censure="http://www.censure.fr" xmlns="http://www.sante-ra.fr"></MessageTruc></Message></TrucBidule></SOAP-ENV:Body></SOAP-ENV:Envelope>
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  5. #5
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 674
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 674
    Points : 5 259
    Points
    5 259
    Par défaut
    Apparement il n'y a que le "NS1:" rajouté dans les bases qui pose problème.

    J'ai défini un BeforeExecute contenant ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SOAPRequest := StringReplace(SOAPRequest,'NS1:','',[rfReplaceAll, rfIgnoreCase]);
    SOAPRequest := StringReplace(SOAPRequest,':NS1','',[rfReplaceAll, rfIgnoreCase]);
     
    Tracer.Verbose( TraceCategory, SOAPRequest );
    Le traceur est optionnel dans cette procédure. C'est juste un outil qui me permet de Logger.

    ça fonctionne mais je ne trouve vraiment pas ça très propre. Il doit y avoir une options à la con dans les options du converter ou dans invokeOptions qui permet de le faire mais étant pressé par le temps je vais me voir contraint de laisser le code en l'état.

    Je tag en résolu mais je suis preneur si quelqu'un a une solution plus propre .

  6. #6
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    ce qui est bien avec XML c'est que c'est standard et que tout le monde se comprend

    bon ok, je sors
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

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

Discussions similaires

  1. Comment changer le format de DATE dans Oracle
    Par khanfir dans le forum Oracle
    Réponses: 3
    Dernier message: 20/04/2010, 19h55
  2. Changer le format d'une date dans la commande
    Par leloup84 dans le forum SAP Crystal Reports
    Réponses: 3
    Dernier message: 07/08/2007, 13h42
  3. Réponses: 9
    Dernier message: 14/02/2007, 17h28
  4. Comment changer le format d'un TIME dans EasyPHP
    Par brazilia28 dans le forum SQL Procédural
    Réponses: 6
    Dernier message: 08/12/2006, 17h31
  5. [VBA-E]changer le format d'une cellule dans un spreadsheet
    Par delamarque dans le forum Macros et VBA Excel
    Réponses: 14
    Dernier message: 13/02/2006, 11h12

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