微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何从 Alfresco 工作流对 REST ws 进行 API 调用?

如何解决如何从 Alfresco 工作流对 REST ws 进行 API 调用?

我遵循了本教程:https://ecmarchitect.com/alfresco-developer-series-tutorials/workflow/tutorial/tutorial.html 现在,我已经创建了一个 HelloWorld 工作流,并使用 Alfresco Maven SDKAlfresco 6.2 成功部署了它。这是在服务器日志中打印 Hello World! 的相应 .bpmn 文件的一部分:

    <sequenceFlow id="flow1" sourceRef="startevent1" targetRef="usertask1">
        <extensionElements>
            <activiti:executionListener event="start" class="org.alfresco.repo.workflow.activiti.listener.ScriptExecutionListener">
                <activiti:field name="script">
                    <activiti:string>logger.log("Hello,World!");</activiti:string>
                </activiti:field>
            </activiti:executionListener>
        </extensionElements>
    </sequenceFlow>

但是,我需要对 https://google.com 进行 API 调用,仅用于测试目的。但是,当我尝试这样做时:

    <sequenceFlow id="flow1" sourceRef="startevent1" targetRef="usertask1">
        <extensionElements>
            <activiti:executionListener event="start" class="org.alfresco.repo.workflow.activiti.listener.ScriptExecutionListener">
                <activiti:field name="script">
                    <activiti:string>
                        var url = "https://google.com";
                        
                        var xhr = new XMLHttpRequest();
                        xhr.open("GET",url);
                        
                        xhr.onreadystatechange = function () {
                           if (xhr.readyState === 4) {
                              logger.log(xhr.status);
                              logger.log(xhr.responseText);
                           }};
                        
                        xhr.send();                 
                    </activiti:string>
                </activiti:field>
            </activiti:executionListener>
        </extensionElements>
    </sequenceFlow>

我收到此异常:

org.alfresco.scripts.ScriptException: 01030043 Failed to execute supplied script: 01030042 ReferenceError: "XMLHttpRequest" is not defined. (AlfrescoJS#3)
    at org.alfresco.repo.jscript.Rhinoscriptprocessor.executeString(Rhinoscriptprocessor.java:287)
    at org.alfresco.repo.processor.ScriptServiceImpl.executeString(ScriptServiceImpl.java:293)
    at org.alfresco.repo.processor.ScriptServiceImpl.executeScriptString(ScriptServiceImpl.java:200)

正在调查中,我查看了这篇文章https://hub.alfresco.com/t5/alfresco-content-services-forum/calling-rest-service-via-rule-script/td-p/32830。 似乎(根据我的理解)我需要使用 Java 类进行 API 调用,然后以某种方式从 .bpmn 文件上的 js 调用该对象。所以:

  1. 能否请您告诉我必须在我的 Maven 项目中的何处创建此类?是包裹吗?你能告诉我如何创建它的确切步骤吗?
  2. 您能否在此处粘贴实现此类的确切代码
  3. 你能告诉我如何从 .bpmn 文件中的 js 调用 java 对象吗?

重要提示我需要以某种方式记录 API 调用响应。它可以是您想要的日志,但我需要知道 Google 是否会相应地回复我。

提前致谢!

解决方法

首先,您必须创建一个 alfresco maven project。然后,您必须按照 alfresco docs 创建一个 Java 支持的 web 脚本。

以下是 webscript desc.xml 的示例。

<webscript>
  <shortname>BPM Review</shortname>
  <description>Review and approve a BPM task</description>
  <url>/someco/bpm/review?id={idArgument}&amp;action={transArgument}</url>
  <format default="html">extension</format>
  <authentication runas="admin">guest</authentication>
  <transaction>required</transaction>
</webscript>



// Dependencies
    private WorkflowService workflowService;

    @Override
    protected Map<String,Object> executeImpl(WebScriptRequest req,Status status) {
        
        final String id = req.getParameter("id");
        final String action = req.getParameter("action");

        if (id == null || action == null) {
            logger.debug("Email,ID,action,or secret not set");
            status.setCode(400);            
            status.setMessage("Required data has not been provided");
            status.setRedirect(true);
        }
        
        Map<String,Object> model = new HashMap<String,Object>();
        
        logger.debug("About to update task,id:" + id + " with outcome:" + action);
        
        Map<QName,Serializable> props = new HashMap<QName,Serializable>();
        props.put(QName.createQName(SomeCoWorkflowModel.NAMESPACE_SOMECO_WORKFLOW_CONTENT_MODEL,SomeCoWorkflowModel.PROP_APPROVE_REJECT_OUTCOME),action);
        workflowService.updateTask(id,props,null,null);      
        workflowService.endTask(id,action);
        logger.debug("Task updated and ended.");    

        return model;
}

然后你可以在任何地方调用 webscript 作为 Rest 调用,如下所示。

http://localhost:8080/alfresco/service/someco/bpm/review?id=activiti$

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。