2009-07-28 12 views
3

J'ai un problème pour accéder à un service Web via Delphi. J'ai consommé un fichier WSDL Java avec la version 2007 de l'outil WSDLimp et il semble que tous les objets aient été créés correctement. Quand je fais un programme de testeur cependant qui appelle le service, chaque objet est vide. Si je vide l'objet SOAPResponse dans la méthode HTTPRIOAfterExecute, je peux voir que j'ai récupéré un paquet de Soap XML correctement formaté qui contient toutes les données auxquelles je m'attendais, mais je ne peux pas y accéder via les objets. Alors, y a-t-il quelque chose qui me manque?Problème des services Web Delphi 2005

+0

Puisque vous utilisez l'importateur de ligne de commande au lieu de l'IDE, voici une référence pratique. http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/FR/html/devwin32/wsdlimp_xml.html –

Répondre

1

La réponse du service Web contient des espaces de noms aliasés pour chaque attribut. Ces alias ne sont pas définis dans le fichier WSDL. Par exemple, le WSDL contient un espace de noms de "http://www.example.com/SomeService" et les alias de requête qui sont à la volée en tant que xmlns: ns3 = "http://www.example.com/SomeService" dans le nœud de niveau supérieur. Les attributs de la réponse ressemblent donc à ns3: somePropertyName = "[value]".

Dans l'unité OPToSOAPDomConv, dans TSOAPDomConv.InitObjectFromSOAP, il tente de rechercher un nom d'attribut sans le préfixe d'espace de noms. Cela provoque l'échec de la recherche et la suppression de la propriété d'objet. Cela arrive même avec les fichiers source 2007.

La meilleure solution que je peux voir est de modifier la routine InitObjectFromSOAP.

Vers la ligne 4181, ajouter:

RemTypeRegistry.InfoToURI(PropList[i].PropType^, NS, PropName, IsScalar); 

et changer le AttrNode.HasAttribute pour passer la variable NS comme un second paramètre, il ressemble à:

if AttrNode.HasAttribute(ExternalPropName, NS) then 

En outre, quelques lignes vers le bas est un appel SetObjectPropFromText. Le dernier paramètre est la valeur d'attribut, et vous aurez besoin de changer Attr.Attributes [ExternalPropName] pour

SetObjectPropFromText(Instance, PropList[I], AttrNode.GetAttributeNS(ExternalPropName, NS)) 

Et bien sûr, déclarer le NS, PropName et IsScalar vars.

1

Delphi a laissé tomber la balle sur le soutien du service Web après Delphi 7 et n'a pas obtenu leur acte nouveau ensemble jusqu'à Delphi 2007 (bien que 2006 a été une amélioration).

Si cela fonctionne pour vous dans Delphi 2007, vous pouvez probablement travailler dans Delphi 2005 en utilisant l'environnement d'exécution SOAP mis à jour.

http://cc.embarcadero.com/Item/24535

+0

Je n'ai malheureusement pas accès à D2007. J'ai utilisé le WSDLimp qui est référencé dans votre lien.J'ai définitivement remarqué que le D2005 créait un code incroyablement mauvais. Je pense que mon problème se produit où la réponse SOAP est traduite dans les objets. Une idée où cela se produit? J'ai essayé de passer en revue le code mais je n'ai pas vu où cela essaye même de se produire. – mcmar

+0

Utilisez-vous les unités mises à jour à partir du même lien? Ils sont ce que Delphi 2007 utilise et seront capables de gérer l'unité générée par le nouveau WSDLImp et les paquets SOAP du service Web. –

+0

J'avouerai que je n'utilisais pas la source mise à jour jusqu'à hier quand j'ai réalisé qu'il y avait une source avec le nouveau WSDL. Mais j'obtiens exactement les mêmes résultats de toute façon. – mcmar

0

Je relis la question et le fait que c'est un service Web Java m'a rappelé quelque chose. Veillez à utiliser les dernières unités WSDLImp et SOAP. Recherchez dans l'unité importée l'appel à RegisterInvokeOptions. Le second paramètre devrait être ioDocument. Que se passe-t-il si vous changez cela en ioDefault?

Je me souviens d'un post quelque part qui suggérait cela pour les services web Java NetBeans (peut-être?), Mais je ne l'ai pas essayé.

Questions connexes