如何将 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).

祝你好运!