UiPath Documentation
integration-service
2.2510
true
Integration Service 用户指南
重要 :
请注意,此内容已使用机器翻译进行了本地化。 Integration Service 中提供的连接器包采用的是机器翻译的译文。 新发布内容的本地化可能需要 1-2 周的时间才能完成。

全局脚本

在 Connector Builder for Automation Suite 2.2510 配置全局脚本,以在每个 API 请求之前或之后运行 JavaScript,以实现一致的请求和响应处理。

使用连接器生成器中的“全局脚本”选项卡,您可以编写在连接器发出每个 API 请求之前或之后运行的 JavaScript。使用前请求脚本修改传出请求,使用后请求脚本修改传出请求。

何时使用全局脚本

当您需要对连接器中的所有请求应用一致的逻辑时,全局脚本非常有用,例如:

  • 发送前注入或覆盖请求标头、参数或正文
  • 根据配置值动态构建供应商 URL
  • 在供应商响应正文返回到工作流之前转换正文
  • 在不调用供应商 API 的情况下,根据自定义条件停止请求

编写脚本

要打开“全局脚本” 选项卡,请执行以下操作:

  1. 在 Integration Service 中,打开“连接器生成器”并选择自定义连接器。
  2. 从顶部导航栏中选择“全局脚本”
  3. 展开“请求前脚本”“请求后脚本” ,然后输入 JavaScript。

脚本在沙盒 JavaScript 环境中运行。以下限制条件适用:

  • require()仅适用于一组预先批准的库(请参阅使用代码片段)。无法导入任意包。
  • 网络 API( fetchXMLHttpRequestWebSocket )不可用。
  • eval不可用。
  • 可以使用标准 JavaScript 内置函数( JSONDateArrayObjectURLBufferencodeURIComponent )。

done()函数

每个脚本都必须调用done()以表示已完成。done()用于立即终止执行 — 无法访问在done()之后写入的任何代码。

// Pass through unchanged
done();

// Override one or more output values
done({
  request_vendor_headers: updatedHeaders
});

// Return multiple overrides
done({
  request_vendor_body: newBody,
  request_vendor_headers: newHeaders
});

// Stop the request — do not call the vendor API
done({ continue: false });

// Stop the request and return an error
done({
  continue: false,
  response_status_code: 400,
  response_error_message: "Invalid action"
});
// Pass through unchanged
done();

// Override one or more output values
done({
  request_vendor_headers: updatedHeaders
});

// Return multiple overrides
done({
  request_vendor_body: newBody,
  request_vendor_headers: newHeaders
});

// Stop the request — do not call the vendor API
done({ continue: false });

// Stop the request and return an error
done({
  continue: false,
  response_status_code: 400,
  response_error_message: "Invalid action"
});

使用代码片段

在脚本面板中选择“代码片段” ,以将代码模板插入到活动脚本编辑器中。以下模板可用:

  • “导入库” - 为脚本沙盒中可用的其中一个预先批准的库插入require()调用: buffercryptohttphttpsquerystringurlutil zlibaxioslodashjmespathmomentrequestrequest-promise
  • 先决条件脚本
    • “更新提供程序” — 插入用于修改传出供应商请求属性的模板。
    • “使用配置对象” — 插入用于读取连接器配置值的模板。
    • 停止提供程序请求— 插入done({ continue: false })模式以在不调用供应商 API 的情况下缩短请求。

前请求脚本

在将每个 API 调用发送到提供程序之前,预请求脚本会运行。可以通过done()设置具有写入读写访问权限的变量。

变量访问描述
request_method读取API 调用的 HTTP 方法( GETPOST等)。
request_vendor_method读取和写入将传递给提供程序的 HTTP 方法。
request_headers读取作为 API 调用的一部分传递的请求标头。
request_vendor_headers读取和写入将发送给提供程序的标头。
request_path读取API 调用的请求路径。
request_vendor_path读取和写入将发送给提供程序的请求路径。如果路径以http开头,则将其用作完整的请求 URL。
request_path_variables读取从 URL 模板中提取的路径变量。
request_parameters读取作为 API 调用的一部分传递的查询参数。
request_vendor_parameters读取和写入将发送给提供程序的查询参数。
request_body读取作为 API 调用的一部分作为字符串传递的请求正文。
request_body_raw读取请求正文作为 API 调用的一部分作为未处理的字符串传递。
request_vendor_body读取和写入将发送给提供程序的请求正文。接受写入字符串、列表或映射。
request_body_map读取作为 API 调用的一部分作为映射传递的请求正文。
request_vendor_body_map读取系统会将作为映射发送给提供程序的请求正文。
request_vendor_url读取将用于供应商调用的完全格式端点 URL。
request_expression读取已转换为{attribute, value, operator}映射列表的 CEQL where参数。
request_previous_response读取上一个链接资源的响应正文。如果不属于链, null
request_previous_response_headers读取上一个链接资源的响应标头。如果不属于链, null
request_root_key读取和写入用于在请求 JSON 有效负载中构建子对象的点路径路径(例如data.record )。
object_name读取请求的规范对象名称。
vendor_object_name读取供应商对象名称。与object_name相同,除非在资源上进行覆盖。
configuration读取连接器配置属性。
response_status_code写入continuefalse时要返回的 HTTP 状态代码。
response_error_message写入在将请求发送给供应商之前返回的错误消息。
response_body写入continuefalse时要返回的响应正文。
response_body_raw写入continuefalse时,要以字符串形式返回的响应正文。
response_root_key读取和写入用于将响应限制为子对象的点格式路径(例如data.records )。
multipart_hook_context_items读取和写入用于文件上传请求的多部分表单项。
continue写入设置为false可跳过供应商调用。默认为true

示例:通过配置注入动态标头

var headers = request_vendor_headers || {};
var config = configuration || {};

headers['Authorization'] = 'Bearer ' + config['oauth_token'];

done({ request_vendor_headers: headers });
var headers = request_vendor_headers || {};
var config = configuration || {};

headers['Authorization'] = 'Bearer ' + config['oauth_token'];

done({ request_vendor_headers: headers });

示例:覆盖供应商 URL 路径

var baseUrl = configuration['base_url'];
if (!baseUrl) {
  done({ continue: false, response_error_message: "Missing configuration: 'base_url'" });
  return;
}

var apiVersion = configuration['api_version'] || 'v1';
var modelId = request_path_variables.modelId;
var vendorUrl = baseUrl.startsWith('http') ? baseUrl : 'https://' + baseUrl;

done({
  request_vendor_path: vendorUrl + '/' + apiVersion + '/models/' + modelId + '/completions'
});
var baseUrl = configuration['base_url'];
if (!baseUrl) {
  done({ continue: false, response_error_message: "Missing configuration: 'base_url'" });
  return;
}

var apiVersion = configuration['api_version'] || 'v1';
var modelId = request_path_variables.modelId;
var vendorUrl = baseUrl.startsWith('http') ? baseUrl : 'https://' + baseUrl;

done({
  request_vendor_path: vendorUrl + '/' + apiVersion + '/models/' + modelId + '/completions'
});

示例:修改请求正文

var body = typeof request_body_map === 'string'
  ? JSON.parse(request_body_map)
  : request_body_map;

body.max_tokens = body.max_tokens || 1024;
body.temperature = 0.7;

done({
  request_vendor_headers: { 'Content-Type': 'application/json' },
  request_vendor_body: JSON.stringify(body)
});
var body = typeof request_body_map === 'string'
  ? JSON.parse(request_body_map)
  : request_body_map;

body.max_tokens = body.max_tokens || 1024;
body.temperature = 0.7;

done({
  request_vendor_headers: { 'Content-Type': 'application/json' },
  request_vendor_body: JSON.stringify(body)
});

后请求脚本

请求后脚本在收到供应商的响应后运行。所有前请求变量仍可用作“读取”。将添加以下特定于响应的变量,并且configuration变为“读取和写入”。可以通过done()设置具有写入读写访问权限的变量。

变量访问描述
response_iserror读取true 供应商响应指示存在错误(200–207 以外的状态代码)。
response_status_code读取和写入来自供应商的 HTTP 状态代码。
response_body读取和写入来自供应商的响应正文。
response_body_raw读取和写入来自供应商的原始响应正文,为字符串形式。
response_body_raw_map读取来自供应商的原始响应正文,作为映射。
response_body_map读取供应商的响应正文,作为映射。
response_headers读取和写入来自供应商的响应标头。
response_error_message写入要返回的错误消息。将响应转换为错误。
response_root_key读取和写入用于将响应限制为子对象的点格式路径(例如data.records )。
configuration读取和写入连接器配置属性。更改会保留到连接器实例。
multipart_hook_context_items读取和写入用于文件上传请求的多部分表单项。
metadata_merge写入设置为true可将供应商元数据与模型元数据相结合。
提示:

在每个请求后脚本中添加错误防护。如果响应是错误,则不加参数调用done() ,以使其保持不变。

示例:转换响应正文

if (response_iserror) {
  done();
  return;
}

var body = typeof response_body === 'string'
  ? JSON.parse(response_body)
  : response_body;

body.processed = true;
body.timestamp = new Date().toISOString();

done({ response_body: body });
if (response_iserror) {
  done();
  return;
}

var body = typeof response_body === 'string'
  ? JSON.parse(response_body)
  : response_body;

body.processed = true;
body.timestamp = new Date().toISOString();

done({ response_body: body });

实用功能

以下实用程序函数在两种脚本类型中都可用:

函数描述
console.log()输出调试消息。

自带 LLM 连接器用例

如果要为 LLM 提供程序(例如自托管模型或第三方推理端点)构建连接器,全局脚本可让您调整请求和响应以匹配预期合同,而无需单独修改每个资源。

提示:

对于常见的 LLM 提供程序(AWS Bedrock、Azure OpenAI、Google Vertex AI、OpenAI V1),您可以从预填充身份验证设置和脚本的连接器模板开始。有关详细信息,请参阅使用连接器模板

以下脚本显示了此场景的完整请求前设置和请求后设置。

前置请求:设置身份验证标头

从连接器配置中注入提供程序的 API 密钥,并强制执行预期的Content-Type

var headers = {
  'Content-Type': 'application/json',
  'x-api-key': configuration['api_key']
};

done({
  request_vendor_headers: headers,
  request_vendor_body: request_body_map
});
var headers = {
  'Content-Type': 'application/json',
  'x-api-key': configuration['api_key']
};

done({
  request_vendor_headers: headers,
  request_vendor_body: request_body_map
});

预请求:插入系统消息

设置默认模型参数,并确保发送给模型的每个对话中均包含系统消息:

var body = typeof request_body_map === 'string'
  ? JSON.parse(request_body_map)
  : request_body_map;

body.max_tokens = body.max_tokens || 1024;
body.temperature = 0.7;

var hasSystemMessage = body.messages.some(function(msg) {
  return msg.role === 'system';
});

if (!hasSystemMessage) {
  body.messages.unshift({
    role: 'system',
    content: 'You are a helpful assistant.'
  });
}

done({
  request_vendor_headers: { 'Content-Type': 'application/json' },
  request_vendor_body: JSON.stringify(body)
});
var body = typeof request_body_map === 'string'
  ? JSON.parse(request_body_map)
  : request_body_map;

body.max_tokens = body.max_tokens || 1024;
body.temperature = 0.7;

var hasSystemMessage = body.messages.some(function(msg) {
  return msg.role === 'system';
});

if (!hasSystemMessage) {
  body.messages.unshift({
    role: 'system',
    content: 'You are a helpful assistant.'
  });
}

done({
  request_vendor_headers: { 'Content-Type': 'application/json' },
  request_vendor_body: JSON.stringify(body)
});

请求后:处理选项数组

迭代供应商响应中的choices数组,并添加自定义元数据,然后返回到工作流:

if (response_iserror) {
  done();
  return;
}

var body = typeof response_body === 'string'
  ? JSON.parse(response_body)
  : response_body;

if (body.choices && body.choices.length > 0) {
  body.choices.forEach(function(choice) {
    choice.processed_by = 'connector-post-script';
  });
}

body.custom_metadata = {
  processed: true,
  timestamp: new Date().toISOString()
};

done({ response_body: body });
if (response_iserror) {
  done();
  return;
}

var body = typeof response_body === 'string'
  ? JSON.parse(response_body)
  : response_body;

if (body.choices && body.choices.length > 0) {
  body.choices.forEach(function(choice) {
    choice.processed_by = 'connector-post-script';
  });
}

body.custom_metadata = {
  processed: true,
  timestamp: new Date().toISOString()
};

done({ response_body: body });

最佳实践

  • 始终调用done() — 未调用done()的脚本会挂起请求。
  • 在变更前复制变量— 运行时使用严格模式 。先赋值给局部变量var headers = request_vendor_headers; ,然后修改headers
  • 不要在done()之后写入代码,此代码无法访问。
  • 检查nullundefined — 对于 GET 和 DELETE 请求, request_bodyrequest_vendor_body是否为undefined
  • 使用continue: false进行短接— 直接返回响应,而不调用供应商。

此页面有帮助吗?

连接

需要帮助? 支持

想要了解详细内容? UiPath Academy

有问题? UiPath 论坛

保持更新