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

Web & réseau Delphi Discussion :

Webservice SOAP - Rajouter préfixes dans parametres


Sujet :

Web & réseau Delphi

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2002
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2002
    Messages : 146
    Par défaut Webservice SOAP - Rajouter préfixes dans parametres
    Bonjour,

    J'ai un problème avec des Web Services que j'essaie d'interroger. Lorsque j'appelle des WS avec paramètres la requête XML envoyée n'est pas bonne : il manque des préfixes dans les noms des paramètres. Ceux-ci apparaissent pourtant bien dans les entêtes.

    Ex :

    Ce que j'envoie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <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" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/">
    <SOAP-ENV:Body xmlns:NS1="http://xxx.com/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
    <NS1:MyFonction>
    <code xsi:type="xsd:string">TEST</code>
    <with_no_accuse xsi:type="xsd:boolean">true</with_no_accuse>
    <depuis_nb_jour xsi:type="xsd:int">0</depuis_nb_jour>
    <masque_de_donnee xsi:type="xsd:int">0</masque_de_donnee>
    <nb_max_objxsi:type="xsd:int">10</nb_max_obj>
    </NS1:MyFonction>
    </SOAP-ENV:Body>
    </SOAP-ENV:Envelope>
    Ce que je devrais envoyer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <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" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/">
      <SOAP-ENV:Body SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
        <NS1:MyFonction xmlns:NS1="http://xxx.com/">
    <NS1:code xsi:type="xsd:string">TEST</NS1:code>
    <NS1:with_no_accuse xsi:type="xsd:boolean">true</NS1:with_no_accuse>
    <NS1:depuis_nb_jour xsi:type="xsd:int">0</NS1:depuis_nb_jour>
    <NS1:masque_de_donnee xsi:type="xsd:int">0</NS1:masque_de_donnee>
    <NS1:nb_max_obj xsi:type="xsd:int">10</NS1:nb_max_obj>
        </NS1:MyFunction>
      </SOAP-ENV:Body>
    </SOAP-ENV:Envelope>

    Remarquez qu'il n'y a que dans le nom des paramètres que ce n'est pas là. Est-ce un problème lors de l'import ? Y a t-t-il une option etc. ? Je n'ai rien trouvé...

    Merci d'avance.

  2. #2
    Membre Expert

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 296
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2002
    Messages : 1 296
    Par défaut
    Quelle version de Delphi? L'importateur(?) de Delphi 7 par exemple ne gère pas forcément tout correctement.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2002
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2002
    Messages : 146
    Par défaut
    Il s'agit de DELPHI XE2

    Apparement, sur le 2006 j'avais le même problème...

  4. #4
    Membre Expert

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 296
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2002
    Messages : 1 296
    Par défaut
    Aurais-tu le WDSL pour que l'on puisse faire des essais?

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2002
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2002
    Messages : 146
    Par défaut
    Oui, je peux te donner cela mais en mp...

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2002
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2002
    Messages : 146
    Par défaut
    C'est envoyé. J'ai cependant un doute quand je vois ce genre de choses :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    <s:element name="GetAllNewReservation">
    <s:complexType>
    <s:sequence>
    <s:element minOccurs="0" maxOccurs="1" name="code_env" type="s:string"/>
    <s:element minOccurs="1" maxOccurs="1" name="with_no_accuse" type="s:boolean"/>
    <s:element minOccurs="1" maxOccurs="1" name="depuis_nb_jour" type="s:int"/>
    <s:element minOccurs="1" maxOccurs="1" name="masque_de_donnee" type="s:int"/>
    <s:element minOccurs="1" maxOccurs="1" name="nb_max_obj" type="s:int"/>
    </s:sequence>
    </s:complexType>
    </s:element>
    Ca ne devrait pas être 'NS1:' à la place de 's:' devant les noms de variables ?
    (le xml fait un peut plus de 20000 lignes...!)

  7. #7
    Membre Expert

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 296
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2002
    Messages : 1 296
    Par défaut
    Je n'ai pas de mp

    Un WDSL partiel peut suffire.

  8. #8
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    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 : 14 037
    Par défaut
    Ce préfix s'appelle un NameSpace !
    Faudrait jouer avec Soap.InvokeRegistry
    Ton problème ressemble à Delphi 2009 & forçage de namespace

    le serveur refuse-t-il ta réponse pour que cela t'inquiète à ce point ?

    le protocole SOAP a subi de nombreuses variantes de genre, pour information en D7 cela acceptait sans problème une réponse document encoded envoyé à un serveur PHP 4 NuSoap, PHP 5 Zend Soap, ou C# Net 2.0

    Le PHP arrivait même à gérer une réponse RPC encoded alors que la WDSL était a priori en document litéral (non géré par D7)
    A savoir que le mode RPC encoded est de moins en moins populaire au profit du document literal

    Delphi 5 utilise les spécifications d'original du SOAP 1.0 et du WSDL 1.0,
    Delphi 7 est SOAP 1.1 et WSDL 1.1 mais toujours en "encoded"
    Delphi 2010 et XE, c'est passé à SOAP 1.2 et WSDL 2.0 et toujours du RPC encoded !


    Possible que le générateur de SOAP des TRemotable ne fournisse pas toutes les variantes du SOAP
    Au besoin Web Service Toolkit
    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

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2002
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2002
    Messages : 146
    Par défaut
    Linkin, je t'ai envoyé le xml par message privé tout a l'heure. Je viens de le renvoyer...

    Shai,

    le prob viens d'appel aux WS avec paramètres. Les fonctions sans arguments ne posent pas problème. J'ai un Time out avec les autres . D'après les fournisseurs des WS, l'erreur vient de l'appel à la fonction sans ces fameux 'Namespaces' 'NS1' devant le nom de ces paramètres. Il leur suffit de rajouter NS1 devant les arguments pour que cela fonctionne.

    Les WS ont été développés en C# apparemment.

  10. #10
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    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 : 14 037
    Par défaut
    un coup tu as code_env et l'autre code seulement

    une bidouille, je n'ai pas la syntaxe exacte mais un truc genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     InvRegistry.RegisterExternalPropName(InterfaceWS, 'code_env', 'ns1:code_env');
    il est possible que tu as déjà ce genre de ligne à fin du WSDL_Imp généré pour les conflits avec des mots clés Delphi
    je l'avais utilisé pour forcer un nombre propriété qui ne passait pas !

    Autre type de bidouille
    Pour préfixer avec des NameSpace, voir [D7]NameSpace pour un paramètre de fonction d'un WebService , j'ai créé une classe héritée de THTTPRIO en redéfinissant le DoBeforeExecute pour moi même avec des StringReplace modifié le XML généré, voir Changer le format dans SOAP

    Peut-être que le OnBeforeExecute de XE2 corrige le bug de D7 sur :

    Vous pouvez utiliser le paramètre SoapRequest pour lire ou modifier la requête SOAP avant sa transmission au serveur
    Faux en D7 !
    ???? en DXE2

    Faudra que tu corriges le code de manipulation Stream<->String avec l'unicode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SOAPRequest := StringReplace(SOAPRequest,'code_env', 'ns1:code_env',[rfReplaceAll, rfIgnoreCase]);
    ...
    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

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2002
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2002
    Messages : 146
    Par défaut
    Je vais essayer de corriger les requetes avec les stringreplace, on verra...

  12. #12
    Membre Expert

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 296
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2002
    Messages : 1 296
    Par défaut
    Je ne trouve pas comment faire à part la solution de Shai.

    Par contre, la réponse envoyée par Delphi et celle attendue sont équivalentes. (Le namespace se propage pour les les éléments sans namespace).

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2002
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2002
    Messages : 146
    Par défaut
    Je n'ai pas eu le temps hier d'aller plus loin. Mais, j'ai remarqué qu'il y avait des problèmes dans l'entête de la requête...

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2002
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2002
    Messages : 146
    Par défaut
    C'est réglé ! Le problème était en fait à l'importation du WSDL : j'ai dû modifier l'interface dans le .pas. Maintenant ça marche.

  15. #15
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    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 : 14 037
    Par défaut
    Juste par curiosité,
    Pourrais-tu indiquer l'anomalie généré par l'importateur
    Ainsi que la correction que tu as apporté

    Cela pourra aider un membre un jour prochain

    Moi-même, il y a quelques années, j'ai joué avec les options Unwind, literal et autre truc du genre comme utiliser l'importateur de D2009 mais en utilisant le fichier généré en D7 (en le nettoyant des nouveaux mots clés)
    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

  16. #16
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2002
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2002
    Messages : 146
    Par défaut
    Ok, Shai, voilà les fonctions ajoutées dans le code généré automatiquement :

    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    function GetWS_XXXX_OBJSoap(UseWSDL: Boolean=System.False; Addr: string=''; HTTPRIO: THTTPRIO = nil): WS_XXXX_OBJSoap;
    function GetWS_XXXX_OBJHttpGet(UseWSDL: Boolean=System.False; Addr: string=''; HTTPRIO: THTTPRIO = nil): WS_XXXX_OBJHttpGet;
    function GetWS_XXXX_OBJHttpPost(UseWSDL: Boolean=System.False; Addr: string=''; HTTPRIO: THTTPRIO = nil): WS_XXXX_OBJHttpPost;
    implementation
     
    uses SysUtils;
     
    function GetWS_XXXX_OBJSoap(UseWSDL: Boolean; Addr: string; HTTPRIO: THTTPRIO): WS_XXXX_OBJSoap;
    const
      defWSDL = 'http://webservices.XXXX.com/wsapplication/ws_XXXX_obj.asmx?WSDL';
      defURL  = 'http://webservices.XXXX.com/wsapplication/ws_XXXX_obj.asmx';
      defSvc  = 'WS_XXXX_OBJ';
      defPrt  = 'WS_XXXX_OBJSoap12';
    var
      RIO: THTTPRIO;
    begin
      Result := nil;
      if (Addr = '') then
      begin
        if UseWSDL then
          Addr := defWSDL
        else
          Addr := defURL;
      end;
      if HTTPRIO = nil then
        RIO := THTTPRIO.Create(nil)
      else
        RIO := HTTPRIO;
      try
        Result := (RIO as WS_XXXX_OBJSoap);
        if UseWSDL then
        begin
          RIO.WSDLLocation := Addr;
          RIO.Service := defSvc;
          RIO.Port := defPrt;
        end else
          RIO.URL := Addr;
      finally
        if (Result = nil) and (HTTPRIO = nil) then
          RIO.Free;
      end;
    end;
     
     
    function GetWS_XXXX_OBJHttpGet(UseWSDL: Boolean; Addr: string; HTTPRIO: THTTPRIO): WS_XXXX_OBJHttpGet;
    const
      defWSDL = 'http://webservices.XXXX.com/wsapplication/ws_XXXX_obj.asmx?WSDL';
      defURL  = '';
      defSvc  = 'WS_XXXX_OBJ';
      defPrt  = 'WS_XXXX_OBJHttpGet';
    var
      RIO: THTTPRIO;
    begin
      Result := nil;
      if (Addr = '') then
      begin
        if UseWSDL then
          Addr := defWSDL
        else
          Addr := defURL;
      end;
      if HTTPRIO = nil then
        RIO := THTTPRIO.Create(nil)
      else
        RIO := HTTPRIO;
      try
        Result := (RIO as WS_XXXX_OBJHttpGet);
        if UseWSDL then
        begin
          RIO.WSDLLocation := Addr;
          RIO.Service := defSvc;
          RIO.Port := defPrt;
        end else
          RIO.URL := Addr;
      finally
        if (Result = nil) and (HTTPRIO = nil) then
          RIO.Free;
      end;
    end;
     
     
    function GetWS_XXXX_OBJHttpPost(UseWSDL: Boolean; Addr: string; HTTPRIO: THTTPRIO): WS_XXXX_OBJHttpPost;
    const
      defWSDL = 'http://webservices.XXXX.com/wsapplication/ws_XXXX_obj.asmx?WSDL';
      defURL  = '';
      defSvc  = 'WS_XXXX_OBJ';
      defPrt  = 'WS_XXXX_OBJHttpPost';
    var
      RIO: THTTPRIO;
    begin
      Result := nil;
      if (Addr = '') then
      begin
        if UseWSDL then
          Addr := defWSDL
        else
          Addr := defURL;
      end;
      if HTTPRIO = nil then
        RIO := THTTPRIO.Create(nil)
      else
        RIO := HTTPRIO;
      try
        Result := (RIO as WS_XXXX_OBJHttpPost);
        if UseWSDL then
        begin
          RIO.WSDLLocation := Addr;
          RIO.Service := defSvc;
          RIO.Port := defPrt;
        end else
          RIO.URL := Addr;
      finally
        if (Result = nil) and (HTTPRIO = nil) then
          RIO.Free;
      end;
    end;
    Dans mon code il y a :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    var
        xxxxProxy : WS_XXXX_OBJSoap;
    ...
     
    if xxxxProxy = nil then
            xxxxProxy := GetWS_XXXX_OBJSoap(False, '', nil);
     
     
    // Appel de la fonction WS:
     
    MyVariable := xxxxProxy.MyWSFunction(123, 456, 789);
    En souhaitant que ça peut aider !!!

  17. #17
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    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 : 14 037
    Par défaut
    Citation Envoyé par lejert Voir le message
    C'est j'ai dû modifier l'interface dans le .pas.
    Merci pour le code mais je ne vois pas ce que tu as modifié par rapport à ce qui est généré automatiquement

    Tu as fourni le code de Factory de HTTPRIO mais pas celui de l'interface et j'aurais cru que c'était ce dernier le plus intéressant !
    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

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

Discussions similaires

  1. [2005] Appel WebService SOAP dans un TRIGGER
    Par dsr57 dans le forum Développement
    Réponses: 5
    Dernier message: 03/12/2014, 14h37
  2. Réponses: 1
    Dernier message: 09/10/2014, 16h50
  3. Webservice SOAP et fichier attaché ?
    Par Bruno13 dans le forum Services Web
    Réponses: 13
    Dernier message: 03/04/2006, 17h36
  4. [Utile]Rajout automatique dans input et verif date
    Par matpal dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 08/11/2004, 16h36
  5. Rajouter "Tous" dans une Liste Déroulante
    Par smirold dans le forum IHM
    Réponses: 7
    Dernier message: 25/10/2004, 13h29

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