我在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方法时,我得到消息
任何帮助都会很好。
更新
我从
更改了代码RUN SetERPSavedStatus IN hServiceSoap(INPUT symbol, OUTPUT resp)
to
RUN SetERPSavedStatus IN hServiceSoap(INPUT symbol, INPUT param, OUTPUT resp)
因为我意识到该方法有2个输入参数,第1个是字符串,第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个输出)。试图与字符串/整数/句柄的类型结合,没有任何作用。还是一样的错误。我尝试在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>
答案 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).
祝你好运!