我可以通过外部 SOAP 调用启动 Service Now 工作流吗?

Can I start a Service Now workflow via an external SOAP call?

我想调用 ServiceNow SOAP 网络服务以启动特定网络服务的实例。

我可以找到像 incident.do 这样的功能的 WSDL,但似乎缺少为工作流找到合适的 table/endpoint 所需的步骤。

如果您想通过 SOAP 启动工作流,我认为唯一的方法是创建一个 Scripted Web-Service or a Custom Processor

在那里你必须定义一个脚本来启动你的工作流。

var w = new Workflow();
var context = w.startFlow(id, current, current.operation(), getVars());

this wiki 文章中,您可以找到 API 工作流方法。

棘手的一点是将变量放入工作流中。 虽然这听起来很容易,但实际上并非如此。

如果您的工作流程 运行 在 table sc_req_item 上(如果您正在处理请求履行,则很可能),您首先需要设置 属性 (sys_properties) glide.workflow.enable_input_variables 为真,否则您将无法将正常的输入变量添加到您的工作流中。

然后,将输入变量添加到工作流中。请注意,您有一些漂亮的数据类型 available there。请注意例如 "Data Structure" 类型。 所有输入变量都被视为客户列(实际上它们是特定于 workflw 的列 table)。这就是名称以 u_.

开头的原因

比方说,您定义了一个名为 u_dynamic_vars(数据类型 "Data Structure")的输入变量。

调用工作流的方法如下:

var wf_name = "Name of your workflow";

// Instantiate JSON machinery
var parser = new JSON();

//Declare an instance  of workflow.js 
var wf  = new Workflow ();
//Get the workflow id 
var  wfId  = wf.getWorkflowFromName (wf_name) ;

//Start workflow, passing along object containing name/value pairs mapping to inputs expected by the workflow 
var vars  = { } ;

// Prepare the JSON Datastructure
var obj ={"name":"George",
      "lastname":"Washington"};

// Encode the data
vars.u_dynamic_vars = parser.encode(obj);
vars.u_new_email = "inject@new.com";


// Get a specific RITM
var gr = GlideRecord("sc_req_item");
gr.get("18d8e9740f4013002f504c6be1050e48");
gs.print(gr.number);

// Start the Workflow with a "current" record
wf.startFlow(wfId , gr , "update" , vars ) ;

// You may also pass null, then current is null.
wf.startFlow(wfId , null , "update" , vars ) ;

在工作流程中,您可以像这样解压数据:

// Let's unpack it. For some reason, intantiating the parse won't work here...
payload = JSON.parse(workflow.variables.u_dynamic_vars);
gs.print("payload.first_name:" + payload.name);

另请注意,工作流不一定需要 运行 上 table。 为此,在定义工作流时选择 "global" 作为 table 名称。