如何将 table 作为输入参数传递给 Web 服务?
How to pass table as input parameter to Web Service?
我正在 Progress Openedge 中调用 WSDL 的方法。到目前为止,我在调用 "GET" 方法时没有遇到问题,我只需要传递密码即可。问题是当我需要使用 "SET" 方法时需要密码 + 一些存储在 temp-tables 中的数据。到目前为止,我已经搜索过并没有找到任何可以帮助我的东西。
下面是调用 GET 方法的代码。
DEFINE VARIABLE hWebService AS HANDLE NO-UNDO.
DEFINE VARIABLE hServiceSoap AS HANDLE NO-UNDO.
DEFINE VARIABLE symbol AS CHARACTER NO-UNDO.
DEFINE VARIABLE resp AS CHARACTER NO-UNDO.
define variable xmlCHar as longchar no-undo.
CREATE SERVER hWebService.
hWebService:CONNECT("-WSDL 'url_of_my_wsdl'").
IF NOT hWebService:CONNECTED() THEN DO:
MESSAGE "SERVER: " SKIP "url_of_my_wsdl" SKIP
"is not connected"
VIEW-AS ALERT-BOX INFO BUTTONS OK.
RETURN.
END.
RUN GET_smth_or_SET_smth SET hServiceSoap ON hWebService.
IF NOT VALID-HANDLE(hServiceSoap) THEN DO:
MESSAGE "PortType: " VALID-HANDLE(hServiceSoap) " is not valid"
VIEW-AS ALERT-BOX INFO BUTTONS OK.
RETURN.
END.
/* password/key */
symbol = "1234asasdas".
RUN SetERPSavedStatus IN hServiceSoap(INPUT symbol, OUTPUT resp).
IF ERROR-STATUS:ERROR THEN DO:
DEFINE VARIABLE iCnt AS INTEGER NO-UNDO.
DO iCnt = 1 TO ERROR-STATUS:NUM-MESSAGES:
MESSAGE ERROR-STATUS:GET-MESSAGE(iCnt)
VIEW-AS ALERT-BOX INFO BUTTONS OK.
END.
IF VALID-HANDLE(ERROR-STATUS:ERROR-OBJECT-DETAIL) THEN DO:
DEFINE VARIABLE hXML AS HANDLE NO-UNDO.
DEFINE VARIABLE mDoc AS MEMPTR NO-UNDO.
CREATE X-DOCUMENT hXML.
hXML:LOAD('LONGCHAR', ERROR-STATUS:ERROR-OBJECT-DETAIL:SOAP-FAULT-DETAIL:GET-SERIALIZED(), FALSE).
hXML:SAVE("memptr", mDoc).
MESSAGE "Fault Code : " ERROR-STATUS:ERROR-OBJECT-DETAIL:SOAP-FAULT-CODE SKIP
"Fault String: " ERROR-STATUS:ERROR-OBJECT-DETAIL:SOAP-FAULT-STRING SKIP
"Fault Actor : " ERROR-STATUS:ERROR-OBJECT-DETAIL:SOAP-FAULT-ACTOR SKIP
"Error Type : " ERROR-STATUS:ERROR-OBJECT-DETAIL:TYPE SKIP SKIP
"Fault Detail: " SKIP GET-STRING(mDoc,1)
VIEW-AS ALERT-BOX INFO BUTTONS OK.
END.
END.
/* display of respond*/
MESSAGE resp
VIEW-AS ALERT-BOX INFO BUTTONS OK.
DELETE OBJECT hServiceSoap.
hWebService:DISCONNECT().
DELETE OBJECT hWebService.
我需要 change/improve 什么才能在临时 table 中发送我的密码数据?当我 运行 此 GET 方法代码时,它起作用了。当我将它用于 SET 方法时,我收到消息
任何帮助都会很好。
更新
我更改了代码
RUN SetERPSavedStatus IN hServiceSoap(INPUT symbol, OUTPUT resp)
to
RUN SetERPSavedStatus IN hServiceSoap(INPUT symbol, INPUT param, OUTPUT resp)
因为我意识到该方法有 2 个输入参数,第一个是字符串,第二个是字符串数组。现在错误是
更新 2
接下来是输入参数 (WSDL)
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="key" type="s:string"/>
<s:element minOccurs="0" maxOccurs="1" name="ids" type="tns:ArrayOfInt"/>
</s:sequence>
输出响应是
<s:element minOccurs="0" maxOccurs="1" name="Result" type="tns:ArrayOfInt"/>
进行中,我还有 3 个参数(2 个输入和 1 个输出)。试图与 string/integer/handle 的类型结合,但没有任何效果。仍然是同样的错误。我尝试在 Boomerang 中测试方法,它在那里工作,所以这不是方法的问题。
在这个应用程序中,我用请求调用了这个方法
<x:Envelope xmlns:x="http://schemas.xmlsoap.org/soap/envelope/" xmlns:izv="http://link...">
<x:Header/>
<x:Body>
<izv:nameOfMethod>
<izv:key>123abcdwqsad112312</izv:key>
<izv:ids>
<izv:int>1</izv:int>
<izv:int>2</izv:int>
<izv:int>3</izv:int>
<izv:int>3108</izv:int>
<izv:int>5</izv:int>
<izv:int>6</izv:int>
<izv:int>7</izv:int>
<izv:int>3070</izv:int>
<izv:int>8</izv:int>
</izv:ids>
</izv:nameOfMethod>
</x:Body>
</x:Envelope>
该请求的响应如下
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
<nameOfMethodResponse xmlns="http://link...">
<nameOfMethodResult>
<int>0</int>
<int>0</int>
<int>0</int>
<int>1</int>
<int>0</int>
<int>0</int>
<int>0</int>
<int>1</int>
<int>0</int>
</nameOfMethodResult>
</nameOfMethodResponse>
</soap:Body>
</soap:Envelope>
调用基于SOAP的网络服务器时,一般输入输出参数都是XML-文档。通常情况下,您需要将它们作为 XML 使用 LONGCHAR 变量而不是数据集或临时表的文档来处理。
如果使用简单的 input/output 调用网络服务,您也许可以创建匹配的数据集或临时表,但我认为这种情况很少见。
首先,您需要 运行 'bprowsdldoc' 使用提供的 WSDL 来从您的网络服务中获得可读的规范。
基本上:
proenv> bprowsdldoc mywsdl.wsdl [directory]
这将在 "directory" 中创建一组基于 html 的文档。打开 index.html 并查看 'Operation index'(它位于文档的右上角)。
在那里您将看到 wsdl 提供的所有操作的列表。如果单击其中一个,您将看到有关其构造方式和调用方式的基本方法。您还会看到一些定义,这些定义可能对您有帮助,也可能没有帮助,具体取决于 input/output 数据的复杂程度。
基本过程原型可能如下所示:
PROCEDURE WS_WebserviceName:
DEFINE INPUT PARAMETER DATASET FOR WS_Indata.
DEFINE OUTPUT PARAMETER WS_Outdata AS LONGCHAR NO-UNDO.
END PROCEDURE.
您可以看到各种数量的 inputs/outputs 和各种类型。但这一切都归结为:
PROCEDURE WS_WebserviceName:
DEFINE INPUT PARAMETER InputData AS LONGCHAR NO-UNDO.
DEFINE OUTPUT PARAMETER OutputData AS LONGCHAR NO-UNDO.
END PROCEDURE.
(XML 进去,XML 出去。)
在创建输入数据和解析输出数据时,您需要查看文档的其余部分(由 bprowsdldoc 创建)或提供的示例。您应该在此处查看 XML 文档:
https://community.progress.com/community_groups/openedge_general/w/openedgegeneral/2743.openedge-11-6-product-documentation
基本上有两种使用 XML 的方法:SAX 和 DOM。阅读文档并选择最适合您的内容!您也可以像处理文本一样处理 xml,但这很可能会导致问题!
一旦你完成了创建和解析 xml 你将把它存储在 longchar 变量和 input/output 那些到网络服务。沿途的事情:
RUN MyWebService IN MyWebServicePort (INPUT XMLInput, OUTPUT XmlOutput).
祝你好运!
我正在 Progress Openedge 中调用 WSDL 的方法。到目前为止,我在调用 "GET" 方法时没有遇到问题,我只需要传递密码即可。问题是当我需要使用 "SET" 方法时需要密码 + 一些存储在 temp-tables 中的数据。到目前为止,我已经搜索过并没有找到任何可以帮助我的东西。 下面是调用 GET 方法的代码。
DEFINE VARIABLE hWebService AS HANDLE NO-UNDO.
DEFINE VARIABLE hServiceSoap AS HANDLE NO-UNDO.
DEFINE VARIABLE symbol AS CHARACTER NO-UNDO.
DEFINE VARIABLE resp AS CHARACTER NO-UNDO.
define variable xmlCHar as longchar no-undo.
CREATE SERVER hWebService.
hWebService:CONNECT("-WSDL 'url_of_my_wsdl'").
IF NOT hWebService:CONNECTED() THEN DO:
MESSAGE "SERVER: " SKIP "url_of_my_wsdl" SKIP
"is not connected"
VIEW-AS ALERT-BOX INFO BUTTONS OK.
RETURN.
END.
RUN GET_smth_or_SET_smth SET hServiceSoap ON hWebService.
IF NOT VALID-HANDLE(hServiceSoap) THEN DO:
MESSAGE "PortType: " VALID-HANDLE(hServiceSoap) " is not valid"
VIEW-AS ALERT-BOX INFO BUTTONS OK.
RETURN.
END.
/* password/key */
symbol = "1234asasdas".
RUN SetERPSavedStatus IN hServiceSoap(INPUT symbol, OUTPUT resp).
IF ERROR-STATUS:ERROR THEN DO:
DEFINE VARIABLE iCnt AS INTEGER NO-UNDO.
DO iCnt = 1 TO ERROR-STATUS:NUM-MESSAGES:
MESSAGE ERROR-STATUS:GET-MESSAGE(iCnt)
VIEW-AS ALERT-BOX INFO BUTTONS OK.
END.
IF VALID-HANDLE(ERROR-STATUS:ERROR-OBJECT-DETAIL) THEN DO:
DEFINE VARIABLE hXML AS HANDLE NO-UNDO.
DEFINE VARIABLE mDoc AS MEMPTR NO-UNDO.
CREATE X-DOCUMENT hXML.
hXML:LOAD('LONGCHAR', ERROR-STATUS:ERROR-OBJECT-DETAIL:SOAP-FAULT-DETAIL:GET-SERIALIZED(), FALSE).
hXML:SAVE("memptr", mDoc).
MESSAGE "Fault Code : " ERROR-STATUS:ERROR-OBJECT-DETAIL:SOAP-FAULT-CODE SKIP
"Fault String: " ERROR-STATUS:ERROR-OBJECT-DETAIL:SOAP-FAULT-STRING SKIP
"Fault Actor : " ERROR-STATUS:ERROR-OBJECT-DETAIL:SOAP-FAULT-ACTOR SKIP
"Error Type : " ERROR-STATUS:ERROR-OBJECT-DETAIL:TYPE SKIP SKIP
"Fault Detail: " SKIP GET-STRING(mDoc,1)
VIEW-AS ALERT-BOX INFO BUTTONS OK.
END.
END.
/* display of respond*/
MESSAGE resp
VIEW-AS ALERT-BOX INFO BUTTONS OK.
DELETE OBJECT hServiceSoap.
hWebService:DISCONNECT().
DELETE OBJECT hWebService.
我需要 change/improve 什么才能在临时 table 中发送我的密码数据?当我 运行 此 GET 方法代码时,它起作用了。当我将它用于 SET 方法时,我收到消息
任何帮助都会很好。
更新
我更改了代码
RUN SetERPSavedStatus IN hServiceSoap(INPUT symbol, OUTPUT resp)
to
RUN SetERPSavedStatus IN hServiceSoap(INPUT symbol, INPUT param, OUTPUT resp)
因为我意识到该方法有 2 个输入参数,第一个是字符串,第二个是字符串数组。现在错误是
更新 2
接下来是输入参数 (WSDL)
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="key" type="s:string"/>
<s:element minOccurs="0" maxOccurs="1" name="ids" type="tns:ArrayOfInt"/>
</s:sequence>
输出响应是
<s:element minOccurs="0" maxOccurs="1" name="Result" type="tns:ArrayOfInt"/>
进行中,我还有 3 个参数(2 个输入和 1 个输出)。试图与 string/integer/handle 的类型结合,但没有任何效果。仍然是同样的错误。我尝试在 Boomerang 中测试方法,它在那里工作,所以这不是方法的问题。
在这个应用程序中,我用请求调用了这个方法
<x:Envelope xmlns:x="http://schemas.xmlsoap.org/soap/envelope/" xmlns:izv="http://link...">
<x:Header/>
<x:Body>
<izv:nameOfMethod>
<izv:key>123abcdwqsad112312</izv:key>
<izv:ids>
<izv:int>1</izv:int>
<izv:int>2</izv:int>
<izv:int>3</izv:int>
<izv:int>3108</izv:int>
<izv:int>5</izv:int>
<izv:int>6</izv:int>
<izv:int>7</izv:int>
<izv:int>3070</izv:int>
<izv:int>8</izv:int>
</izv:ids>
</izv:nameOfMethod>
</x:Body>
</x:Envelope>
该请求的响应如下
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
<nameOfMethodResponse xmlns="http://link...">
<nameOfMethodResult>
<int>0</int>
<int>0</int>
<int>0</int>
<int>1</int>
<int>0</int>
<int>0</int>
<int>0</int>
<int>1</int>
<int>0</int>
</nameOfMethodResult>
</nameOfMethodResponse>
</soap:Body>
</soap:Envelope>
调用基于SOAP的网络服务器时,一般输入输出参数都是XML-文档。通常情况下,您需要将它们作为 XML 使用 LONGCHAR 变量而不是数据集或临时表的文档来处理。
如果使用简单的 input/output 调用网络服务,您也许可以创建匹配的数据集或临时表,但我认为这种情况很少见。
首先,您需要 运行 'bprowsdldoc' 使用提供的 WSDL 来从您的网络服务中获得可读的规范。
基本上:
proenv> bprowsdldoc mywsdl.wsdl [directory]
这将在 "directory" 中创建一组基于 html 的文档。打开 index.html 并查看 'Operation index'(它位于文档的右上角)。
在那里您将看到 wsdl 提供的所有操作的列表。如果单击其中一个,您将看到有关其构造方式和调用方式的基本方法。您还会看到一些定义,这些定义可能对您有帮助,也可能没有帮助,具体取决于 input/output 数据的复杂程度。
基本过程原型可能如下所示:
PROCEDURE WS_WebserviceName:
DEFINE INPUT PARAMETER DATASET FOR WS_Indata.
DEFINE OUTPUT PARAMETER WS_Outdata AS LONGCHAR NO-UNDO.
END PROCEDURE.
您可以看到各种数量的 inputs/outputs 和各种类型。但这一切都归结为:
PROCEDURE WS_WebserviceName:
DEFINE INPUT PARAMETER InputData AS LONGCHAR NO-UNDO.
DEFINE OUTPUT PARAMETER OutputData AS LONGCHAR NO-UNDO.
END PROCEDURE.
(XML 进去,XML 出去。)
在创建输入数据和解析输出数据时,您需要查看文档的其余部分(由 bprowsdldoc 创建)或提供的示例。您应该在此处查看 XML 文档: https://community.progress.com/community_groups/openedge_general/w/openedgegeneral/2743.openedge-11-6-product-documentation
基本上有两种使用 XML 的方法:SAX 和 DOM。阅读文档并选择最适合您的内容!您也可以像处理文本一样处理 xml,但这很可能会导致问题!
一旦你完成了创建和解析 xml 你将把它存储在 longchar 变量和 input/output 那些到网络服务。沿途的事情:
RUN MyWebService IN MyWebServicePort (INPUT XMLInput, OUTPUT XmlOutput).
祝你好运!