Le forum (ô combien francophone) des utilisateurs de Powerbuilder.
Bonjour,
J'expérimente avec PB9 l'appel du webservice d'un fournisseur ; après avoir déployé le WSDL avec le Web Service Proxy Wizard, j'ai codé l'appel suivant :
ls_proxy = "dqeaddressmatch" lsc_dqe = Create SoapConnection lsc_dqe.setOptions("SoapLog=~"C:\\soaplog.txt~"") ll_ret = lsc_dqe.CreateInstance(lws_dqe, ls_proxy, "http://prod.dqe-software.com:7799/wsdl") If ll_ret <> 0 Then Choose Case ll_ret Case 100 ls_message = "Nom de proxy invalide (" + ls_proxy + ")" Case 101 ls_message = "Impossible de créer le proxy" Case Else ls_message = "" End Choose MessageBox(gAppNom, "Une erreur est survenue à la création de l'instance DQE (" + String(ll_ret) + ")~r" + ls_message, StopSign!) lb_ret = False Else Try lst_lsa.Liste = lst_dqe lst_lsa.MaxReturnedCandidate = 32 lst_lsar = lws_dqe.LookupSingleLineAddress(lst_lsa) Catch (SoapException e) MessageBox(gAppNom, "Une erreur est survenue à l'appel de DQE.LookupSingleLineAddress :~r" & + e.getMessage(), Exclamation!) lb_ret = False End Try End If
L'exception reçue est la susnommée "could not resolve host name prod.dqe-software.com" ; j'ai tenté le CreateInstance en utilisant le EndPoint par défaut (qui est le même que décrit ci-dessus), même problème. L'URL est bonne et non bloquée par notre proxy (testée dans un navigateur)
Quelle pourraient être les raisons de cette exception ?
Dernière modification par sbouvetJD (05-03-2012 14:38:12)
Hors ligne
Bonjour,
sbouvetJD a écrit:
L'URL est bonne et non bloquée par notre proxy (testée dans un navigateur)
Quelle pourraient être les raisons de cette exception ?
Si il y a un proxy "corporate", peut-être que les objets PB ne l'utilisent pas par défaut ?
Est-ce que
lsc_dqe.SetProxyServer (address, userID, password)
// ou
lsc_dqe.SetProxyServer (hostname, port, userID, password)
pourrait aider ?
Hors ligne
Bonjour,
Dans la mesure, on ton navigateur passe par un proxy, la résolution dns peut être réalisé par le proxy lui-même et non sur ton poste. Le fait que l'URL fonctionne dans ton navigateur ne garantit pas le fonctionnement à partir d'une autre application.
Pour vérifier cela, tu lances en ligne de commande sur le poste concerné l'utilitaire nslookup, à l'invite, tu tapes le hostname : prod.dqe-software.com. Si en réponse tu n'obtiens pas l'adresse ip correspondante au hostname, tu as certainement l'origine du problème => could not resolve host name.
Dans ce cas, tu peux éventuellement contourner le problème en ajoutant manuellement une entrée dans le fichier hosts du poste se trouvant dans le répertoire : C:\Windows\System32\drivers\etc ou utiliser un serveur dns dans la configuration réseau du poste qui te permette de résoudre cette adresse.
Hors ligne
buck a écrit:
Pour vérifier cela, tu lances en ligne de commande sur le poste concerné l'utilitaire nslookup, à l'invite, tu tapes le hostname : prod.dqe-software.com. Si en réponse tu n'obtiens pas l'adresse ip correspondante au hostname, tu as certainement l'origine du problème => could not resolve host name.
Ça dépend du navigateur :
- avec Chrome ou IE, les réglages concernant le proxy sont commun à ceux du panneau de configuration / Internet, et nslookup utilise ces réglages également
- avec Firefox, les réglages de proxy sont indépendants.
(Pour Opera, je ne sais pas).
Hors ligne
buck a écrit:
Dans ce cas, tu peux éventuellement contourner le problème en ajoutant manuellement une entrée dans le fichier hosts du poste se trouvant dans le répertoire : C:\Windows\System32\drivers\etc ou utiliser un serveur dns dans la configuration réseau du poste qui te permette de résoudre cette adresse.
Merci pour ces éléments ; si cela venait à fonctionner, il me faudrait cependant le déployer sur tous mes postes utilisateurs ?
Hors ligne
Après appel du SetProxyServerOptions, le message d'erreur a changé :
Unknown SOAP Response Tag http://schemas.xmlsoap.org/wsdl/#definitions (le problème est apparement référencé ici, mais j'ai mangé mon dictionnaire chinois/français ; sinon ici).
Question toute bête, les schémas XML sont-ils case sensitive ? PArce que si c'est le cas on est embêtés car les structures PB mettent tout en minuscule ?
Hors ligne
sbouvetJD a écrit:
Après appel du SetProxyServerOptions, le message d'erreur a changé :
Unknown SOAP Response Tag http://schemas.xmlsoap.org/wsdl/#definitions (le problème est apparement référencé ici, mais j'ai mangé mon dictionnaire chinois/français ; sinon ici).
Je ne pratique pas Soap, mais il faudrait vérifier ce qui est retourné. Ce n'est peut-être pas une réponse soap mais une page html du proxy qui indique que c'est bloqué ou introuvable. Si on ne peut pas sauver ce qui est retourné, il faudrait surveiller ce qui revient du réseau (c'est un peu un canon à mouche mais wireshark m'a souvent aidé pour diagnostiquer les problèmes liés au proxy ici).
D'ailleurs, est-ce que le webservice est hébergé sur une machine du réseau local ? Dans ce cas, il faut peut-être ne pas passer par le proxy et remplir le champ dans les réglages réseau qui permet de lister des machines à accéder directement.
sbouvetJD a écrit:
Question toute bête, les schémas XML sont-ils case sensitive ? PArce que si c'est le cas on est embêtés car les structures PB mettent tout en minuscule ?
Oui, les schémas XML sont case-sensitive (pour les entités et les attributs) mais il ne faut pas confondre le code PB, dans lequel les variables et fonctions ne tiennent pas compte de la casse, et les valeurs qui sont manipulées. Pour les strings PB est case-sensitive. À mon avis, le problème ne vient pas de là.
Hors ligne
Bonjour,
Je suis d'accord avec seki. Dans un premier temps, j'éviterai de passer par le proxy parce que tu utilises le port 7799 et je serais étonné que cela marche sans configurer spécialement le proxy pour cela.
Autre suggestion, on peut aussi être embêté avec les firewalls applicatifs "intelligents" présents maintenant en général avec tous les antivirus qui peuvent bloquer ta requête (vérifier le journal du firewall pour être sur que ça passe).
Hors ligne
Concernant le port, c'est le port ouvert par notre fournisseur, donc on n'a pas choisi ;) Le webservice est hébergé chez notre fournisseur.
En testant ce webservice dans une page .net, cela fonctionne. Je vais faire un test en PB12, pour voir (parce que dans le white paper de Sybase, ils parlent d'une beta, donc je ne sais pas ce qu'il en est à ce jour, si la technologie WSDL a évolué entre 2002 et 2012.
Avec Pb 12 j'ai l'erreur "unknown error, problem with SOAP client"
Hors ligne
J'ai trouvé l'article suivant sur pbdj.sys-con.com :
While PB9 did provide some original support for web services, it wasn’t until the 10.5 release when the .NET engine was added that such support became highly useable. The previous engine, built on the EasySOAP open source library, became largely feature frozen in 2002 when the EasySOAP project essentially became abandonware (http://en.wikipedia.org/wiki/Abandonware). The .NET engine introduced with PB 10.5 did bring the client proxy creation capability to current standards, but there are still some problems with the implementation. For example, PowerScript functions can’t return arrays, and the proxy object is limited to what PowerScript can support. As a result, you currently can’t create a proxy for a web service method that returns an array and expect to be able to do anything with the result (it gets cast as an “any” data type). There is also currently no support for WS-Security (most likely because that’s an add-on feature for .NET 2.x, not part of the original SDK) and for protocols other than SOAP (e.g., REST, JAX-RPC). It’s possible that those latter two issues will be addressed as Sybase implements support for WCF (Windows Communications Foundation) in PowerBuilder 12.0.
Or les méthodes du webservice appelé retournent des structures contenant des tableaux, ceci pourrait expliquer cela ?
Hors ligne
D'un autre côté, j'appelle une méthode qui retourne une structure contenant une simple chaine de caractères, et j'ai le même problème.
Hors ligne
sbouvetJD a écrit:
D'un autre côté, j'appelle une méthode qui retourne une structure contenant une simple chaine de caractères, et j'ai le même problème.
Quel problème ? le retour « Unknown SOAP Response Tag » ?
Hors ligne
seki a écrit:
sbouvetJD a écrit:
D'un autre côté, j'appelle une méthode qui retourne une structure contenant une simple chaine de caractères, et j'ai le même problème.
Quel problème ? le retour « Unknown SOAP Response Tag » ?
Oui ; mais mon prestataire va me fournir un exemple de code en mode REST (avec la technologie JSON - ça fait un peu film d'horreur quand même), je vous dirai ce qu'il en est.
Hors ligne
sbouvetJD a écrit:
Oui ; mais mon prestataire va me fournir un exemple de code en mode REST (avec la technologie JSON - ça fait un peu film d'horreur quand même)
Ça peut être intéressant à traiter, du JSON en PB
Ce qui est simple avec JSON c'est qu'il sérialise des objets en utilisant la syntaxe de leur création, par exemple si un résultat JSON contient { "FirstName" : "Jean", "LastName" : "Dubois" } il est trivial d'évaluer cette syntaxe avec eval() pour recréer l'objet dans un interpréteur javascript :
eval("jsonObj="+http_request.responseText+";"); alert(jsonObj.FirstName + ' ' + jsonObj.LastName); //==> Jean Dubois
Une piste intéressante : une question relative à parser JSON en PB est déjà passée sur le newsgroup PB. Il s'agissait de traiter le JSON par Wsh.
Par contre pour l'épouvante, je pense que j'ai déjà vu pire dans le code que je maintiens
Bon courage
Hors ligne
La solution est la suivante :
ls_URL = "http://monwebservice.com?mesarguments" lo_result = create n_Internet_Result GetContextService("Internet", lo_net) Try li_ret = lo_net.GetURL(ls_URL, lo_result) If li_ret < 0 then return "" ls_data = lo_result.of_getResult() Catch (Throwable e) Return "" End Try
Et après on écrit le petit parser qui va bien pour traiter le retour.
Dernière modification par sbouvetJD (05-03-2012 14:38:48)
Hors ligne
Je reviens sur ce topic pour ce qui est du json en PowerBuilder je viens de publier un objet entierement en pb classic :
json ln_json ln_json = create json string ls_error ls_error = ln_json.parseURL("http://date.jsontest.com") if ls_error = "" then messagebox("date", ln_json.retrieve("date") ) end if destroy ln_json
source : https://github.com/xlat/pbjson, les remarques sont les bienvenues
Hors ligne
Petite précision, l'objet JSON gère les objets, tableaux, chaines, nombres et booléens.
Le projet inclus aussi une petite app de test :
Hors ligne
Super boulot
0000 pépites
Hors ligne