【问题标题】:Progress 4GL web service procedureProgress 4GL 网络服务程序
【发布时间】:2013-11-02 03:33:47
【问题描述】:

我正在尝试使用 Progress 4GL (OpenEdge 10.2B) 使用 Magento API 更新我们的股票

到目前为止一切顺利,即:如果 SKU 匹配,我可以更新库存。但如果不是,它不会返回错误。

所以我研究了 ABL 如何管理 SAOP 故障错误,并找到了一些我尝试实现的示例。但无济于事。

我的代码如下:

DEFINE VARIABLE hWebService AS HANDLE NO-UNDO.
DEFINE VARIABLE hMage_Api_Model_Server_V2_HandlerPortType AS HANDLE NO-UNDO.
DEFINE VARIABLE username AS CHARACTER NO-UNDO.
DEFINE VARIABLE apiKey AS CHARACTER NO-UNDO.
DEFINE VARIABLE stock AS CHARACTER NO-UNDO.
DEFINE VARIABLE codigo AS CHARACTER NO-UNDO.
DEFINE VARIABLE loginReturn AS CHARACTER NO-UNDO.
DEFINE VARIABLE product AS CHARACTER NO-UNDO.
DEFINE VARIABLE data AS LONGCHAR NO-UNDO.
DEFINE VARIABLE resultado AS INTEGER NO-UNDO.
DEFINE VARIABLE SOAP-FAULT-CODE AS CHARACTER NO-UNDO.
DEFINE VARIABLE SOAP-FAULT-DETAIL AS CHARACTER NO-UNDO.
DEFINE VARIABLE iError AS INTEGER     NO-UNDO.
DEFINE VARIABLE cError AS CHARACTER   NO-UNDO.

DO ON ERROR UNDO, THROW:
CREATE SERVER hWebService.

 /* TODO: Definir variaveis globais */
username = 'username'.
apiKey  = 'password'.

hWebService:CONNECT(" -WSDL 'http://www.medicalemcasa.com/api/v2_soap?wsdl'").

RUN Mage_Api_Model_Server_V2_HandlerPortType SET hMage_Api_Model_Server_V2_HandlerPortType ON hWebService.
RUN login IN hMage_Api_Model_Server_V2_HandlerPortType(INPUT username, INPUT apiKey, OUTPUT loginReturn).


product = "100asda001a".
data = "
       <data>
       <qty>'250'</qty>
       </data>
       ".

PROCEDURE catalogInventoryStockItemUpdate:
  DEFINE INPUT PARAMETER data AS CHARACTER NO-UNDO.
END PROCEDURE.

RUN catalogInventoryStockItemUpdate IN hMage_Api_Model_Server_V2_HandlerPortType (INPUT loginReturn, INPUT product, INPUT data, OUTPUT resultado).
DISPLAY resultado.

CATCH mySoapErrorObject AS Progress.Lang.SoapFaultError:
    DO iError = 1 TO mySoapErrorObject:NumMessages:
        cError = cError + mySoapErrorObject:getMessage(iError) + "~n".
    END.
    DELETE OBJECT mySoapErrorObject.
END CATCH.

CATCH mySystemErrorObject AS Progress.Lang.SysError:
    DO iError = 1 TO mySystemErrorObject:NumMessages:
        cError = cError + mySystemErrorObject:getMessage(iError) + "~n".
    END.
    DELETE OBJECT mySystemErrorObject.
END CATCH.

FINALLY:
IF cError <> "" THEN DO:
    MESSAGE "Errors occured:" SKIP
        cError
        VIEW-AS ALERT-BOX ERROR.
END.
END FINALLY.
END.

hWebService:DISCONNECT().
DELETE OBJECT hWebService.

【问题讨论】:

  • 结果是什么(结果变量)?是否发生任何错误?
  • 您还实现了一个我认为的示例,而不是处理错误的一般方法。而不是检查 VersionMismatch 只是尝试 MESSAGE hSoapFault:SOAP-FAULT-DETAIL 并从那里获取它。
  • 您好 Jensd。 “resultado”的结果是 1 无论 SKU 是否存在。关于 hSoapFault,请参阅我的编辑。

标签: web-services api progress-4gl openedge


【解决方案1】:

在我使用过的那些 API 中,只有在出现“更大”错误时才会出现 SOAP 错误。例如,如果 web 服务关闭、登录条件不满足、数据类型错误等。通常返回值在响应中而不是在 SOAP 信封中。

是否可以将不存在的产品设置为库存 0?如果您尝试将其设置为 1 会发生什么?也许您应该从 PHP(或您通常使用的任何语言)仔细检查 Web 服务实际上提供了您在这种情况下所期望的代码?

否则您应该查看创建的 wsdl 文档 - 您是否 100% 确定结果参数(代码中的结果)是一个整数,而不是任何形式的更复杂的 xml 文档(基本上是一个对象)?如果它真的是 HANDLE,则可能是没有运行时错误,但没有将值插入 INTEGER。

此外,您应该删除所有当前的错误处理,并将其替换为更通用的错误处理方式(并在需要时使该代码更具体,而不是从文档中的示例中工作):

DEFINE VARIABLE iError AS INTEGER     NO-UNDO.
DEFINE VARIABLE cError AS CHARACTER   NO-UNDO.

CATCH mySoapErrorObject AS Progress.Lang.SoapFaultError:
    DO iError = 1 TO mySoapErrorObject:NumMessages:
        cError = cError + mySoapErrorObject:getMessage(iError) + "~n".
    END.
    DELETE OBJECT mySoapErrorObject.
END CATCH.

CATCH mySystemErrorObject AS Progress.Lang.SysError:
    DO iError = 1 TO mySystemErrorObject:NumMessages:
        cError = cError + mySystemErrorObject:getMessage(iError) + "~n".
    END.
    DELETE OBJECT mySystemErrorObject.
END CATCH.

并插入到 FINALLY 块中:

IF cError <> "" THEN DO:
    MESSAGE "Errors occured:" SKIP
        cError
        VIEW-AS ALERT-BOX ERROR.
END.

【讨论】:

  • 我用PHP反复检查,发现错误代码101,这意味着插入的SKU不存在。这就是我希望在 ABL 中获得的。结果确实是一个“XML Schema int value”,所以我认为它应该这样定义?关于错误处理,我删除了我拥有的所有内容并插入了您刚刚给我的代码。我必须在开头添加“DO ON ERROR”语句,我认为这是正确的吗?我不知道。
  • 抱歉,如果我自己无法实际运行代码,我将无法再为您提供帮助。您可以查看 Progress Developer Community。也许那里有人与 Magento 合作过。 Link here
  • 没关系,伙计。到目前为止,你帮了我很多,我感谢你。不过,如果您想运行代码,我可以安排通过您希望的任何方式将临时密码发送给您。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-05
相关资源
最近更新 更多