Hello Progress4GL开发人员,
我正在尝试使用进度消耗SOAP API。目前,我仅使用名为[http://webservices.oorsprong.org/websamples.countryinfo/CountryInfoService.wso?WSDL。]的开源示例SOAP服务。
以下程序实现了梦想(即,用户输入国家代码(例如“ ESP”),并向用户显示有关西班牙的详细信息)。结果存储在temp-table1和temp-table2中:
/******* Sample Application to show Progress4GL Consuming a SOAP API *************/ /******* VARIABLES ***************************************************************/ DEFINE VARIABLE lReturn AS LOGICAL NO-UNDO. DEFINE VARIABLE hServer AS HANDLE NO-UNDO. DEFINE VARIABLE hPortType AS HANDLE NO-UNDO. DEFINE VARIABLE capitalCity as LONGCHAR NO-UNDO. DEFINE VARIABLE iCntryCode as char no-undo label "Country Code". DEFINE VARIABLE oResponse as LONGCHAR no-undo. /******* CONNECTION SETTINGS TO SOAP SERVICE *************************************/ CREATE SERVER hServer. lReturn = hServer:CONNECT("-WSDL http://webservices.oorsprong.org/websamples.countryinfo/CountryInfoService.wso?WSDL"). IF lReturn = NO THEN DO: MESSAGE "Could not connect to WebService server". END. /******* SETTING PORT TYPE *******************************************************/ RUN CountryInfoServiceSoapType SET hPortType ON SERVER hServer. IF NOT VALID-HANDLE(hPortType) THEN DO: MESSAGE "Could not establish portType". END. /****** USER UPDATE FORM**********************************************************/ UPDATE iCntryCode. /****** NAME OF DATA FUNCTION TO RUN *********************************************/ RUN FullCountryInfo IN hPortType (INPUT iCntryCode, OUTPUT oResponse) NO-ERROR. /****** TEMP TABLE TO HOLD ALL CAPITAL CITY FIELDS *******************************/ DEFINE TEMP-TABLE temptable1 SERIALIZE-NAME "sCapitalCity" FIELD capitalCity AS CHAR XML-NODE-TYPE "text". /****** DATASET WHICH RUNS CONVERSION ********************************************/ DEFINE DATASET dsa SERIALIZE-NAME "FullCountryInfoResult" FOR temptable1. /***** TEMP TABLE TO HOLD ALL CURRENCY FIELDS ************************************/ DEFINE TEMP-TABLE temptable2 SERIALIZE-NAME "sCurrencyISOCode" FIELD currencyCode AS CHAR XML-NODE-TYPE "text". /****** DATASET WHICH RUNS CONVERSION ********************************************/ DEFINE DATASET dsb SERIALIZE-NAME "FullCountryInfoResult" FOR temptable2. /****** POPULATE DATASET AND TEMP-TABLES FROM SOAP RESPONSE **********************/ DATASET dsa:READ-XML( "longchar", oResponse, ?, ?, ? ). DATASET dsb:READ-XML( "longchar", oResponse, ?, ?, ? ). FOR EACH temptable1 no-lock, each temptable2 no-lock: DISPLAY temptable1.capitalcity temptable2.currencyCode. END. PAUSE 100. /****** STOP CONNECTION TO SERVER ************************************************/ DELETE PROCEDURE hPortType. hServer:DISCONNECT(). DELETE OBJECT hServer.
但是,此示例Web服务还具有一个称为FullCountryInfoAllCountries的过程。这将为所有国家做出回应。我试图重新分解上面的代码,以使所有temp-table1和temp-table2都被所有国家/地区填充,但是我在解析XML数据时遇到了困难。
我曾尝试使用NAMESPACE-URI,SERIALIZATION-NAME和XML-NODE-NAME语句进行试验,但无法使其正常工作。我遇到的问题是,来自FullCountryInfoAllCountries的XML响应的结构与FullCountryInfo的结构不同,并且我总是收到“找不到命名空间”的错误,否则它将在临时表中不返回任何内容。
非常感谢!
您好,Progress4GL开发人员,我正在尝试使用进度来消耗SOAP API。目前,我只是使用一个名为SOAP的开源示例服务:http://webservices.oorsprong.org/websamples ....
您可以通过发送响应(注释掉)来窥视输出,然后可以将其映射到数据集,临时表和字段名称: