soap - 如何调试数据集响应
问题描述
您好 Progress4GL 开发人员,
我正在尝试使用 Magento SOAP API 并将数据集作为我的输出来处理。
我希望我的 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.
没有错误,但无法在临时表中显示响应。提前谢谢了!
解决方案
首先,您应该尝试创建一个与您的预期输出完全匹配的数据集。我会这样做。
我不确定命名空间 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").
然后你可以查看文件,看看里面有什么。至少这是一个开始!
推荐阅读
- mysql - MySQL:有没有办法捕获正在运行的 SQL 查询以在活动/历史日志中使用?
- python - 打印不带括号的字典
- c# - 分配最后一个属性时引发事件
- c# - C#动态对象,根据字符串路径修改属性
- node.js - APP Engine 监听端口 3000 给出 502 Bad Gateway 错误
- mongodb - Mongodb,在同一查询中使用 $match 与 $text 和 $geoNear
- javascript - 在本地设置一个 ionic-react 项目
- google-apps-script - 使用 Google Apps Script for Spreadsheet 自动发送脚本中的问题
- javascript - openstreetmap 无法在“节点”上执行“appendChild”:参数 1 不是“节点”类型
- python - 使用 Python 和 Selenium 刷新网页上的单个项目