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

4D Discussion :

[SOAP] Recevoir un tableau en paramètres


Sujet :

4D

  1. #1
    Membre habitué Avatar de Cyberbob002
    Inscrit en
    Mai 2003
    Messages
    140
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 140
    Points : 146
    Points
    146
    Par défaut [SOAP] Recevoir un tableau en paramètres
    Bonjour,

    Je fais appel à vous car je n'arrive pas à recevoir un tableau (quelque soit le type) sur une méthode publiée en web service. En fait dès que je souhaite accéder à ce tableau, j'ai le droit à une erreur 59 (Type d'argument inattendu). J'en conclu qu'il doit être indefini ...

    J'ai testé avec d'autres types tel que entier, texte, ... et cela fonctionne correctement.

    Avez-vous une idée ?


    PS : j'utilise 4D 2004.4

  2. #2
    Membre confirmé

    Profil pro
    Inscrit en
    Mai 2006
    Messages
    359
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 359
    Points : 613
    Points
    613
    Par défaut
    Bonjour,

    Le serveur SOAP est une base 4D ? Comment avez-vous déclaré vos paramètres d'entrée et de sortie ?

    L'erreur 59 survient quand l'argument envoyé au serveur soap ne correspond pas à ce qu'il attendait pour réaliser la requête.

    Exemple :
    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
     
      ` --------------------------------------
      ` méthode du SERVEUR SOAP
      ` --------------------------------------
    TABLEAU ENTIER LONG(vArticleIDList;0)
    TABLEAU TEXTE(vArticleTitreList;0)
     
      `recherche des articles publiés correspondant au numéro ID envoyé
    DECLARATION SOAP(vArticleID;Est un entier long ;SOAP entrée ;"ID_article")
    CHERCHER([ARTICLES];[ARTICLES]A_Publier=Vrai;*)
    CHERCHER([ARTICLES];[ARTICLES]ID_article=vArticleID)
    SELECTION VERS TABLEAU([ARTICLES]ID_article;vArticleIDList)
    SELECTION VERS TABLEAU([ARTICLES]Titre_article;vArticleTitreList)
    TRIER TABLEAU(vArticleIDList;>)
     
      ` renvoi des ID et titres des articles trouvés via deux tableaux
    DECLARATION SOAP(vArticleIDList;Est un tableau entierlong ;SOAP sortie ;"Liste_ID_articles")
    DECLARATION SOAP(vArticleTitreList;Est un tableau chaîne ;SOAP sortie ;"Liste_titre_articles")
     
    Si (Enregistrements trouves([ARTICLES])>0)
    	` ok 
    Sinon 
    	ENVOYER ERREUR SOAP(SOAP erreur client ;"Pas d’articles disponibles")
    Fin de si 
     
      ` --------------------------------------
      ` méthode du CLIENT SOAP
      ` --------------------------------------
      ` soap_getTitre
      ` genere par l'assistant Web Services de 4D
      ` méthode appelée par soap_getTitre(7) : retourne les titres et ID des articles publiés dont l'ID est égal à 7
     
    C_ENTIER LONG($1)
    TABLEAU ENTIER LONG(proxy_ret1;0)
    TABLEAU TEXTE(proxy_ret2;0)
     
    FIXER PARAMETRE WEB SERVICE("ID_article";$1)
     
    APPELER WEB SERVICE("http://localhost/4DSOAP/";"A_WebService#soap_server_getTitre";"soap_server_getTitre";"http://www.4d.com/namespace/default";Web Service dynamique )
     
    Si (OK=1)
    	LIRE RESULTAT WEB SERVICE(proxy_ret1;"Liste_ID_articles")
    	LIRE RESULTAT WEB SERVICE(proxy_ret2;"Liste_titre_articles";*)
    Fin de si
    Si j'appelle la méthode soap_getTitre sans paramètre, le serveur SOAP me retourne une erreur 59 parce qu'il n'y a pas l'argument ID_article attendu en paramètre d'entrée. Si je passe l'argument attendu : soap_getTitre(7), 7 étant une valeur ENTIER LONG pour l'ID, c'est OK.

    Sinon, les exemples dans ces liens peuvent vous aider aussi :
    Envoyer tableau soap/
    Retourner donnees soap/
    --Steph4D

  3. #3
    Membre habitué Avatar de Cyberbob002
    Inscrit en
    Mai 2003
    Messages
    140
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 140
    Points : 146
    Points
    146
    Par défaut
    Non, pour retourner un tableau avec un entier en entrée il n'y a pas de problèmes. C'est pour en recevoir un dans ma méthode 4D faisant office de serveur SOAP.


    Edit : problème trouvé : IL NE FAUT PAS DÉCLARER LES VARIABLES DANS UNE MÉTHODE SERVEUR SOAP !!

    Voici un petit code d'exemple :

    Méthode serveur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    DECLARATION SOAP(vT_Texte;Est un texte ;SOAP entrée ;"text")
    DECLARATION SOAP(TL_Tab;Est un tableau entierlong ;SOAP entrée ;"Tablo")
     
    DECLARATION SOAP(vT_Sortie;Est un texte ;SOAP sortie ;"out")
     
    vT_Sortie:="Texte en entrée : "+vT_Texte+Caractere(Retour à la ligne )
    vT_Sortie:=vT_Sortie+"Tableau contenant "+Chaine(Taille tableau(TL_Tab))+" éléments"+Caractere(Retour à la ligne )
     
    Boucle ($vL_Indice;1;Taille tableau(TL_Tab))
    	vT_Sortie:=vT_Sortie+"#"+Chaine($vL_Indice)+" : "+Chaine(TL_Tab{$vL_Indice})+Caractere(Retour à la ligne )
    Fin de boucle
    Déclaration :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    C_TEXTE(vT_Texte)
    TABLEAU ENTIER LONG(TL_Tab;0)
    C_TEXTE(vT_Sortie)

    Méthode cliente :
    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
     
    TABLEAU ENTIER LONG(TL_Tab;0)
     
    C_TEXTE(vT_Texte)
    C_TEXTE(vT_Retour)
     
     
    AJOUTER A TABLEAU(TL_Tab;12)
    AJOUTER A TABLEAU(TL_Tab;21)
     
    vT_Texte:="test de texte"
     
    FIXER PARAMETRE WEB SERVICE("text";vT_Texte)
    FIXER PARAMETRE WEB SERVICE("Tablo";TL_Tab)
     
    APPELER WEB SERVICE("http://~~IP~~:8080/4DSOAP/";"A_WebService#WS_Test";"WS_Test";"http://www.4d.com/namespace/default";Web Service dynamique )
     
    Si (OK=1)
    	LIRE RESULTAT WEB SERVICE(vT_Retour;"out";*)**` Libération de la mémoire après retour de la valeur.
    Fin de si

    Travaillant en PHP 5, je vous donne aussi le client PHP :
    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
     
    <?php
    // Désactivation du cache lors de la phase de test
    ini_set("soap.wsdl_cache_enabled", "0");
     
    try {
     
    	$sWSDL = 'http://~~IP~~:8080/4DWSDL/';
     
    	$clientSOAP = new SoapClient($sWSDL);
     
    	$res = $clientSOAP->WS_Test('Test de texte', array(12, 24));
     
    	// Affichage du résultat
    	var_dump($res);
     
    	unset($clientSOAP);
     
     
    } catch (SoapFault $SF) {
    	echo '<pre>';
    	var_dump($SF);
    	echo '</pre>';
    }
    ?>
    Vous devez obtenir quelque chose comme ca :
    Texte en entrée : Test de texte
    Tableau contenant 2 éléments
    #1 : 12
    #2 : 24
    Voila !

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    121
    Détails du profil
    Informations personnelles :
    Âge : 59
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2006
    Messages : 121
    Points : 64
    Points
    64
    Par défaut Ou déclarer les variables
    Citation Envoyé par Cyberbob002 Voir le message
    Non, pour retourner un tableau avec un entier en entrée il n'y a pas de problèmes. C'est pour en recevoir un dans ma méthode 4D faisant office de serveur SOAP.


    Edit : problème trouvé : IL NE FAUT PAS DÉCLARER LES VARIABLES DANS UNE MÉTHODE SERVEUR SOAP !!

    Voici un petit code d'exemple :

    Méthode serveur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    DECLARATION SOAP(vT_Texte;Est un texte ;SOAP entrée ;"text")
    DECLARATION SOAP(TL_Tab;Est un tableau entierlong ;SOAP entrée ;"Tablo")
     
    DECLARATION SOAP(vT_Sortie;Est un texte ;SOAP sortie ;"out")
     
    vT_Sortie:="Texte en entrée : "+vT_Texte+Caractere(Retour à la ligne )
    vT_Sortie:=vT_Sortie+"Tableau contenant "+Chaine(Taille tableau(TL_Tab))+" éléments"+Caractere(Retour à la ligne )
     
    Boucle ($vL_Indice;1;Taille tableau(TL_Tab))
    	vT_Sortie:=vT_Sortie+"#"+Chaine($vL_Indice)+" : "+Chaine(TL_Tab{$vL_Indice})+Caractere(Retour à la ligne )
    Fin de boucle
    Déclaration :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    C_TEXTE(vT_Texte)
    TABLEAU ENTIER LONG(TL_Tab;0)
    C_TEXTE(vT_Sortie)

    Méthode cliente :
    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
     
    TABLEAU ENTIER LONG(TL_Tab;0)
     
    C_TEXTE(vT_Texte)
    C_TEXTE(vT_Retour)
     
     
    AJOUTER A TABLEAU(TL_Tab;12)
    AJOUTER A TABLEAU(TL_Tab;21)
     
    vT_Texte:="test de texte"
     
    FIXER PARAMETRE WEB SERVICE("text";vT_Texte)
    FIXER PARAMETRE WEB SERVICE("Tablo";TL_Tab)
     
    APPELER WEB SERVICE("http://~~IP~~:8080/4DSOAP/";"A_WebService#WS_Test";"WS_Test";"http://www.4d.com/namespace/default";Web Service dynamique )
     
    Si (OK=1)
    	LIRE RESULTAT WEB SERVICE(vT_Retour;"out";*)**` Libération de la mémoire après retour de la valeur.
    Fin de si

    Travaillant en PHP 5, je vous donne aussi le client PHP :
    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
     
    <?php
    // Désactivation du cache lors de la phase de test
    ini_set("soap.wsdl_cache_enabled", "0");
     
    try {
     
    	$sWSDL = 'http://~~IP~~:8080/4DWSDL/';
     
    	$clientSOAP = new SoapClient($sWSDL);
     
    	$res = $clientSOAP->WS_Test('Test de texte', array(12, 24));
     
    	// Affichage du résultat
    	var_dump($res);
     
    	unset($clientSOAP);
     
     
    } catch (SoapFault $SF) {
    	echo '<pre>';
    	var_dump($SF);
    	echo '</pre>';
    }
    ?>
    Vous devez obtenir quelque chose comme ca :


    Voila !
    J'ai essayé ça mais je ne m'en sort pas :
    Moi aussi je suis en PHP et je dois envoyer un tableau à la méthode SOAP 4D.
    Je n'arrive pas à trouver ou il faut déclarer ces variables, j'ai essayé de les déclarer dans la méthode Compiler_web mais ça ne change rien.
    4D me désespère....

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

Discussions similaires

  1. Procédure stockée : passage d'un tableau en paramètres
    Par thomas_strass dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 12/05/2006, 14h52
  2. [VB] Problème de function / sub (tableau comme paramètre)
    Par elhosni dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 10/05/2006, 20h34
  3. [JpGraph] Passage d'un tableau en paramètre dans une URL pour JPgraph
    Par crazydiver_e2 dans le forum Bibliothèques et frameworks
    Réponses: 4
    Dernier message: 16/01/2006, 16h15
  4. Passage de tableau en paramètre...
    Par Doomi dans le forum C
    Réponses: 14
    Dernier message: 20/10/2005, 14h08
  5. Réponses: 3
    Dernier message: 24/09/2005, 09h34

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