如何将表作为输入参数传递给Web服务?

时间:2016-05-17 13:17:15

标签: wsdl progress-4gl openedge

我在Progress Openedge中调用WSDL的方法。到目前为止,我没有问题调用“GET”方法,我只需要传递密码。问题是当我需要使用“SET”方法时,需要密码+存储在临时表中的一些数据。到目前为止,我已经搜索过,发现任何可以帮助我的东西。 下面是用于调用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.

我需要更改/改进以在临时表中使用我的密码数据发送?当我为GET方法运行此代码时,它可以工作。当我将它用于SET方法时,我得到消息 enter image description here

任何帮助都会很好。

更新

我从

更改了代码
RUN SetERPSavedStatus IN hServiceSoap(INPUT symbol, OUTPUT resp)
to 
RUN SetERPSavedStatus IN hServiceSoap(INPUT symbol, INPUT param, OUTPUT resp)

因为我意识到该方法有2个输入参数,第1个是字符串,第2个是字符串数组。现在错误是

enter image description here

更新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个输出)。试图与字符串/整数/句柄的类型结合,没有任何作用。还是一样的错误。我尝试在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>

1 个答案:

答案 0 :(得分:0)

通常,调用基于SOAP的Web服务器时的输入和输出参数是XML文档。通常,您需要将它们作为具有LONGCHAR变量而不是DATASETS或TEMP-TABLES的XML文档来处理。

如果使用简单的输入/输出调用web服务,您可能只能创建匹配的数据集或临时表,但我想这很少见。

首先,您需要使用提供的WSDL运行'bprowsdldoc',以便从Web服务中获取可读的规范。

基本上:

proenv> bprowsdldoc mywsdl.wsdl [directory]

这将在“目录”中创建一组基于html的文档。打开index.html并查看“操作索引”(它位于文档的右上角)。

在那里,您将看到wsdl提供的所有操作的列表。如果单击一个,您将看到有关如何构建它以及如何调用它的基本方法。根据输入/输出数据的复杂程度,您还会看到一些可能会或可能不会帮助您的定义。

基本程序原型可能如下所示:

PROCEDURE WS_WebserviceName:
  DEFINE INPUT PARAMETER DATASET FOR WS_Indata.
  DEFINE OUTPUT PARAMETER WS_Outdata AS LONGCHAR NO-UNDO.
END PROCEDURE.

您可以看到各种数量的输入/输出和各种类型。但这一切都归结为:

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变量中,并将它们输入/输出到webservice。一路走来:

RUN MyWebService IN MyWebServicePort (INPUT XMLInput, OUTPUT XmlOutput).

祝你好运!