В Eserv/3 (3.3x) очень легко. Не знаю, какой у вас WSDL, поэтому возьмем GoogleSearch.wsdl и переделаем его для обращения к Eserv'у вместо Гугла:
В конце GoogleSearch.wsdl заменить:
<!--soap:address location="http://api.google.com/search/beta2"/-->
<soap:address location="http://localhost/search/beta2/"/>
В файл
Eserv3\CONF\pub\wwwroot\search\beta2\
добавьте index.fxml такого содержания:
<?xml version='1.0' encoding='UTF-8'?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance" xmlns:xsd="http://www.w3.org/1999/XMLSchema">
<SOAP-ENV:Body>
<ns1:doGoogleSearchResponse xmlns:ns1="urn:GoogleSearch" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<return xsi:type="ns1:GoogleSearchResult">
<documentFiltering xsi:type="xsd:boolean">false</documentFiltering>
<estimatedTotalResultsCount xsi:type="xsd:int">10000</estimatedTotalResultsCount>
<directoryCategories xmlns:ns2="http://schemas.xmlsoap.org/soap/encoding/" xsi:type="ns2:Array" ns2:arrayType="ns1:DirectoryCategory[0]">
</directoryCategories>
<searchTime xsi:type="xsd:double">0.347907</searchTime>
<resultElements xmlns:ns3="http://schemas.xmlsoap.org/soap/encoding/" xsi:type="ns3:Array" ns3:arrayType="ns1:ResultElement[1]">
<item xsi:type="ns1:ResultElement">
<cachedSize xsi:type="xsd:string">11k</cachedSize>
<hostName xsi:type="xsd:string"></hostName>
<snippet xsi:type="xsd:string">{POST_BODY S" //q" XML_XPATH_MEM@}</snippet>
<directoryCategory xsi:type="ns1:DirectoryCategory">
<specialEncoding xsi:type="xsd:string"></specialEncoding>
<fullViewableName xsi:type="xsd:string"></fullViewableName>
</directoryCategory>
<relatedInformationPresent xsi:type="xsd:boolean">true</relatedInformationPresent>
<directoryTitle xsi:type="xsd:string"></directoryTitle>
<summary xsi:type="xsd:string"></summary>
<URL xsi:type="xsd:string">http://www.eserv.ru/</URL>
<title xsi:type="xsd:string">{POST_BODY 2DUP TYPE CR POST_BODY S" //q" XML_XPATH_MEM@ 2DUP TYPE}</title>
</item>
</resultElements>
<endIndex xsi:type="xsd:int">1</endIndex>
<searchTips xsi:type="xsd:string"></searchTips>
<searchComments xsi:type="xsd:string"></searchComments>
<startIndex xsi:type="xsd:int">1</startIndex>
<estimateIsExact xsi:type="xsd:boolean">false</estimateIsExact>
<searchQuery xsi:type="xsd:string">Enter search term</searchQuery>
</return>
</ns1:doGoogleSearchResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
Весь этот xml'ный мусор нас сейчас интересует мало, главное внутри {...}
POST_BODY - это встроенная переменная Eserv (точнее, acWEB'а в его комплекте), в которую записывается тело POST-запроса. В данном случае там будет xml-текст SOAP-запроса от приложения, использующего указанный WSDL. Этот текст можно пропарсить встроенным xml-парсером (XML_READ_DOC_MEM) и далее выковыривать параметры запроса обходом дерева, но гораздо удобнее сразу извлекать параметры по Xpath:
POST_BODY S" //q" XML_XPATH_MEM@
достает из переданного запроса значение тега <q>, где в гугловом WSDL передается поисковая строка. В этом простейшем примере мы просто вставляем текст запроса в ответ, ничего не ищем
Уверен, что развить этот пример в нужном направлении в зависимости от конкретного wsdl не составит труда. ODBC-либы также встроены в acWEB.
~ac/lib/lin/xml/xml.f (откуда XML_XPATH_MEM@)
~ac/lib/win/odbc/odbcdb.f (пригодится db_gets и т.п.)
*.fxml не используют внешний ForthScript (fs.exe), а работает непосредственно внутри acWEB.exe. Фортовый код можно использовать внутри {...} или {S" file.f" INCLUDED} или подключать plugin'ом к acWEB.