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 :

Problème de passage de paramètre non scalaire (classe)


Sujet :

Web & réseau Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 9
    Par défaut Problème de passage de paramètre non scalaire (classe)
    Bonjour,

    - ce post fait référence au post résolu de vern's web services - pb de communication serveur/client -

    Moi aussi je rencontre le même genre de problème , j'ai besoin de passer en parametre une classe non scalaire lors d'un appel de fonction d'un client vers un serveur web via HTTPRIO.

    Elle est déclarée en TRemotable côté client (suite à l'import du WSDL) mais comme elle n'a pas été crée en Delphi (en C++) côté server je ne sais pas si elle a été crée en équivalent.

    Par contre j'arrive à executer la requête Subscribe avec le petit soft WebServiceStudio qui pointe vers le même WSDL.

    Voici le code cote client :
    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
     
    procedure TForm1.Button1Click(Sender: TObject);
    var
      srResult:TSubscribeResult;
      sFilter : String;
      iuri:WideString;
      itypename:WideString;
    begin
        // création de l'objet non scalaire Subscriber
        srSubscriber := Subscriber.Create() ;
        srSubscriber.ConsumerPort := 0 ;
        srSubscriber.ConsumerHost := 'a';
        srSubscriber.Identifier := '1111' ;
     
        sFilter := 'filtre scaliare';
     
        // création de l'objet résultat de l'appel
        srResult := TSubscribeResult.Create;
        srResult.ResultStatus := TResultStatus.create;
     
        // récup des infos de registration de la classe Subscriber
        RemClassRegistry.GetXSDInfoForClass(TypeInfo(Subscriber),iuri, itypename ) ;
        ShowMessage('Subscriber '  + iuri + ' : ' +  itypename ) ;
     
        srResult := (HTTPRIOOperationSubscriptionService2008 as OperationSubscriptionService2008Soap).Subscribe( (srSubscriber as Subscriber), sFilter);
    ShowMessage('Apres Subscribe '  + GetResultLevel(srResult.ResultStatus.Level) + srResult.ResultStatus.Message ) ;
     
    end;
    Ceci me renvoi comme message : 'Apres Subscribe Error Parametre requis non spécifié Subscriber '
    alors que GetXSDInfoForClass m'a renvoyé les infos sur l'uri et le typename correspondant au RegisterXSClass importé du WSDL
    J'ai le même message d'erreur si je ne fait pas le Create de mon Subscriber.

    Serait il possible qu'il y ait incompatbilité entre la déclaration (en Delphi) côté client et celle en C++ côté server (qui serait traitée par WebServiceStudio)

    et dans ce cas comment le résoudre

    merci pour votre aide ...

    PS : il est quand même étonnant que j'arrive à récupérer le message d'erreur avec sa structure

    suite import wsdl :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    initialization
      InvRegistry.RegisterInterface(TypeInfo(OperationSubscriptionService2008Soap), 'http://www.giro.ca/OperationSubscriptionService2008', 'utf-8');
      InvRegistry.RegisterDefaultSOAPAction(TypeInfo(OperationSubscriptionService2008Soap), '/OperationSubscriptionService2008/%operationName%');
      RemClassRegistry.RegisterXSClass(Subscriber, 'http://www.giro.ca/OperationSubscriptionService2008', 'Subscriber');
      RemClassRegistry.RegisterXSClass(SubscribeResult, 'http://www.giro.ca/OperationSubscriptionService2008', 'SubscribeResult','',false);

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 9
    Par défaut le problème évolue ...
    Salut,

    j'ai toujours un probleme avec le passage de parametres non scalaire (c'est a dire qui ne sont pas de base comme Widestring).

    En fait j'arrive à passer en param une classe du moment que celle ci n'a QUE des attributs scalaire :
    par ex voici la définition effectué côté serveur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      ResultStatus = class(TRemotable)
      private
        FMessage: WideString;
      published
        property Message: WideString read FMessage write FMessage;
      end;
    fonctionne très bien (en param et en renvoi de function)

    par contre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
      ActivityBlockCreatedResult = class(TRemotable)
      private
        FResultStatus: ResultStatus;
      public
        constructor Create ; override ;
        destructor Destroy; override;
      published
        property ResultStatus: ResultStatus read FResultStatus write FResultStatus  ;
      end;
    ne passe plus ...
    le message d'erreur est :
    System.Xml.XmlException: Déclaration XML inattendue. La déclaration XML doit être le premier noeud du document et aucun espace blanc ne doit être placé avant. Ligne 3, position 3.
    les deux classes sont déclarés pour la registry ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      initialization
    RemClassRegistry.RegisterXSClass(ResultStatus, 'http://www.site.fr/OperationServices2008', 'ResultStatus', 'ResultStatus', false);
      RemClassRegistry.RegisterXSClass(ActivityBlockCreatedResult, 'http://www.site.fr/OperationServices2008','ActivityBlockCreatedResult', 'ActivityBlockCreatedResult', false);
    pour info, j'ai déjà essayé de déclarer l'attribut / classe en 'stored AS_ATTRIBUTE;'

    enfin le message envoyé par le client ressemble à ceci :
    <?xml version="1.0" encoding="utf-16"?>
    <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:tns="http://tempuri.org/" xmlns:types="http://tempuri.org/encodedTypes" xmlnssi="http://www.w3.org/2001/XMLSchema-instance" xmlnssd="http://www.w3.org/2001/XMLSchema">
    <soap:Body soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
    <q1:SayHello4 xmlns:q1="utf-8">
    <p href="#id1" />
    </q1:SayHello4>
    <q2:ActivityBlockCreatedResult id="id1" xsi:type="q2:ActivityBlockCreatedResult" xmlns:q2="http://www.site.fr/OperationServices2008">
    <ResultStatus href="#id2" />
    </q2:ActivityBlockCreatedResult>
    <q3:ResultStatus id="id2" xsi:type="q3:ResultStatus" xmlns:q3="http://www.site.fr/OperationServices2008">
    <Message xsi:type="xsd:string" />
    </q3:ResultStatus>
    </soap:Body>
    </soap:Envelope>
    tout aide serait la bienvenue ....

    merci

Discussions similaires

  1. Réponses: 7
    Dernier message: 12/05/2010, 14h00
  2. [template] problème de passage de paramètres
    Par vinny_the_true dans le forum C++
    Réponses: 2
    Dernier message: 14/12/2005, 01h15
  3. Passage de paramètre d'une classe à une autre
    Par semenzato dans le forum C++
    Réponses: 3
    Dernier message: 21/09/2005, 13h59
  4. Réponses: 9
    Dernier message: 13/05/2005, 03h13
  5. problème de passage de paramêtre sous mozilla
    Par mat10000 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 27/09/2004, 10h48

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