Web services 4glweb服务过程的进展

Web services 4glweb服务过程的进展,web-services,api,progress-4gl,openedge,Web Services,Api,Progress 4gl,Openedge,我正在尝试使用Progress 4GL(OpenEdge 10.2B)更新我们的Magento API 到目前为止还不错,即:如果SKU匹配,我可以更新库存。但如果不是,则不会返回错误 因此,我研究了ABL如何管理SAOP故障错误,并找到了一些我尝试实现的示例。但是没有用 我的新代码如下所示: DEFINE VARIABLE hWebService AS HANDLE NO-UNDO. DEFINE VARIABLE hMage_Api_Model_Server_V2_HandlerPortTy

我正在尝试使用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.
将变量hWebService定义为句柄NO-UNDO。
将变量hMage\u Api\u Model\u Server\u V2\u HandlerPortType定义为句柄NO-UNDO。
将变量username定义为字符NO-UNDO。
将变量apiKey定义为字符NO-UNDO。
将变量stock定义为字符NO-UNDO。
将变量codigo定义为字符NO-UNDO。
将变量loginReturn定义为字符NO-UNDO。
将变量product定义为字符NO-UNDO。
将变量数据定义为LONGCHAR NO-UNDO。
将变量resultado定义为整数NO-UNDO。
将变量SOAP-FAULT-CODE定义为字符NO-UNDO。
将变量SOAP-FAULT-DETAIL定义为字符NO-UNDO。
将变量iError定义为整数NO-UNDO。
将变量cError定义为字符NO-UNDO。
执行错误撤消,抛出:
创建服务器hWebService。
/*待办事项:定义全球变量*/
用户名='username'。
apiKey='password'。
hWebService:CONNECT(“-WSDL”http://www.medicalemcasa.com/api/v2_soap?wsdl'").
在hWebService上运行Mage_Api_Model_Server_V2_HandlerPortType设置hMage_Api_Model_Server_V2_HandlerPortType。
在hMage\u Api\u Model\u Server\u V2\u HandlerPortType中运行登录(输入用户名、输入apiKey、输出登录返回)。
product=“100asda001a”。
数据=”
'250'
".
程序目录InventoryStockItemUpdate:
将输入参数数据定义为字符NO-UNDO。
结束程序。
在hMage\U Api\U Model\U Server\U V2\U HandlerPortType(输入登录返回、输入产品、输入数据、输出结果)中运行catalogInventoryStockItemUpdate。
显示结果。
将mysoaperroObject捕获为Progress.Lang.SoapFaultError:
DO iError=1到mySoapErrorObject:NumMessages:
cError=cError+mySoapErrorObject:getMessage(iError)+“~n”。
结束。
删除对象mysoaperroObject。
终点接球。
将mySystemErrorObject捕获为Progress.Lang.SysError:
DO iError=1到mySystemErrorObject:NumMessages:
cError=cError+mySystemErrorObject:getMessage(iError)+“~n”。
结束。
删除对象mySystemErrorObject。
终点接球。
最后:
如果是“cError”,则执行以下操作:
消息“出现错误:”跳过
塞罗
查看为警报框错误。
结束。
最后结束。
结束。
hWebService:断开连接()。
删除对象hWebService。

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

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

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

此外,您还应该删除所有当前的错误处理,并用一种更通用的方法来处理错误(并在需要时使该代码更具体,而不是从文档中的示例进行操作):

并在最后一个块中插入:

IF cError <> "" THEN DO:
    MESSAGE "Errors occured:" SKIP
        cError
        VIEW-AS ALERT-BOX ERROR.
END.
如果是“cError”,则执行以下操作:
消息“出现错误:”跳过
塞罗
查看为警报框错误。
结束。

结果中有什么(resultado变量)?是否发生了任何错误?我认为您已经实现了一个示例,而不是处理错误的一般方法。与其检查VersionMismatch,不如尝试发送消息hSoapFault:SOAP-FAULT-DETAIL并从那里获取它。无论SKU是否存在,“resultado”的结果为1。关于hSoapFault,请参阅我的编辑。我用PHP进行了双重检查,发现错误代码101,这意味着插入的SKU不存在。这就是我在ABL想要得到的。结果确实是一个“XMLSchema int值”,所以我认为应该这样定义?关于错误处理,我删除了我所有的东西,插入了你刚才给我的代码。我不得不在开头添加“doon ERROR”语句,我认为这是正确的?我不知道。对不起,如果我不能亲自运行代码,我想我不能再帮你了。您可以查看ProgressDeveloper社区。也许有人和Magento合作过。没关系,伙计。到目前为止,你帮了我很多,我为此感谢你。如果你想运行代码,我可以安排通过任何方式发送临时密码给你。
IF cError <> "" THEN DO:
    MESSAGE "Errors occured:" SKIP
        cError
        VIEW-AS ALERT-BOX ERROR.
END.