首页 > 解决方案 > 如何调试数据集响应

问题描述

您好 Progress4GL 开发人员,

我正在尝试使用 Magento SOAP API 并将数据集作为我的输出来处理。

下面是来自 WSDL Analayser 的示例过程: 在此处输入图像描述

我希望我的 XML 响应看起来像这样:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="urn:Magento">
   <SOAP-ENV:Body>
      <ns1:salesOrderListResponseParam>
         <result>
            <complexObjectArray>
               <increment_id>600000018</increment_id>
               <store_id>6</store_id>
            </complexObjectArray>
            <complextObjectArray>
               <increment_id>600000019</increment_id>
               <store_id>7</store_id>
            </complexObjectArray>
          </result>
      </ns1:salesOrderListResponseParam>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

我拥有的当前代码如下,我期望在 resultTable 临时表中输出(但当前没有返回任何内容)。

define variable hs as handle no-undo.
define variable hp as handle no-undo.

DEFINE VARIABLE cUsername AS CHARACTER INIT "USERNAME".
DEFINE VARIABLE cPassword AS CHARACTER INIT "PASSWORDAPIKEY".
DEFINE VARIABLE oSession  AS CHARACTER NO-UNDO. 
DEFINE VARIABLE iRequest AS LONGCHAR NO-UNDO.


DEFINE TEMP-TABLE complexObjectArray NO-UNDO
    NAMESPACE-URI "" 
    FIELD key AS CHARACTER 
    FIELD value1 AS CHARACTER 
        XML-NODE-NAME "value" 
    FIELD filter_id AS RECID 
        XML-NODE-TYPE "HIDDEN".

CREATE complexObjectArray.
assign
complexObjectArray.key       = "status"
complexObjectArray.value1    = "pending".

DEFINE DATASET filter NAMESPACE-URI "" 
    FOR complexObjectArray.

DEFINE TEMP-TABLE resultTable NO-UNDO
    NAMESPACE-URI "complexObjectArray" 
    FIELD increment_id AS CHARACTER.    

DEFINE DATASET resultData NAMESPACE-URI "salesOrderListResponseParam" 
    FOR resultTable.

create server hs.
hs:connect( "-WSDL WSDLADDRESSHERE" ). 

run PortType set hp on server hs.

run login in hp ( input cUsername, input cPassword, output oSession ).

message oSession . PAUSE 100.

 run salesOrderList in hp ( input oSession, input dataset filter, output dataset resultData ).

for each resultTable:
    disp resultTable with 2 col.
end.



delete procedure hp.
hs:disconnect().
delete object hs.

没有错误,但无法在临时表中显示响应。提前谢谢了!

标签: soapdatasetopenedgeprogress-4gl

解决方案


首先,您应该尝试创建一个与您的预期输出完全匹配的数据集。我会这样做。

我不确定命名空间 ns1。您可以尝试将其包含在 XML-NODE-NAME 中或通过 NAMESPACE-PREFIX 属性。但即使你把它排除在外,它也可能会起作用。

DEFINE TEMP-TABLE ttResult NO-UNDO
    XML-NODE-NAME  "result" 
    FIELD id AS INTEGER SERIALIZE-HIDDEN.

DEFINE TEMP-TABLE ttcomplexObjectArray NO-UNDO 
    XML-NODE-NAME "complexObjectArray"
    FIELD id as RECID SERIALIZE-HIDDEN
    FIELD increment_id AS CHARACTER 
    FIELD store_id AS CHARACTER.

DEFINE DATASET dsSalesOrderListResponseParam XML-NODE-NAME "salesOrderListResponseParam" 
    FOR ttResult, ttcomplexObjectArray 
        PARENT-ID-RELATION pr1 FOR ttResult, ttcomplexObjectArray PARENT-ID-FIELD id.

DATASET dsSalesOrderListResponseParam:READ-XML("file", "c:\temp\xml.xml", ? , ? , ?).

这适用于您预期响应的“正文”部分(XML-Envelope 等除外),如下所示。

<?xml version="1.0" ?>
<salesOrderListResponseParam >
    <result>
        <complexObjectArray>
            <increment_id>600000018</increment_id>
            <store_id>6</store_id>
        </complexObjectArray>
        <complexObjectArray>
            <increment_id>600000019</increment_id>
            <store_id>7</store_id>
        </complexObjectArray>
    </result>
</salesOrderListResponseParam>

从在数据集看到的情况下保存您的响应开始:

dsSalesOrderListResponseParam:WRITE-XML("file", "response.xml").

然后你可以查看文件,看看里面有什么。至少这是一个开始!


推荐阅读