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

全局脚本

在“连接器生成器”中配置“全局脚本”,以在每个 API 请求之前或之后运行 JavaScript,以保持请求和响应处理的一致性。

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

何时使用全局脚本​

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

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

单个资源的脚本​

每个资源还有自己的“脚本”选项卡,以及“参数” 、 “请求字段” 、 “响应字段”和“活动设计器” 。它提供与连接器级“全局脚本”选项卡相同的请求前脚本和请求后脚本编辑器、相同的代码片段以及相同的变量和done()合同。

区别在于作用域:

  • “全局脚本”选项卡上的脚本会针对连接器发出的每个请求运行。
  • 资源“脚本”选项卡上的脚本仅为该资源运行。

当逻辑适用于一个端点时,请使用资源脚本;当逻辑适用于整个连接器时,请使用全局脚本。

编写脚本​

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

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

脚本在沙盒 JavaScript 环境中运行,没有网络访问权限,也无法导入包。

提供标准 JavaScript 内置文件:JSON、Date、Array、Object、URL、encodeURIComponent、URLSearchParams、TextEncoder、TextDecoder、btoa、atob、crypto、Blob、FormData、Headers、Intl 和 BigInt。

重要提示:

Buffer不可用。改为使用 btoa 和 atob 进行 base64 编码。

以下内容在沙盒中不可用:

类别不可用
评估和导入eval、任何 require() 调用、顶级 import 或 export 语句、动态 import(...) 表达式
网络fetch, XMLHttpRequest, WebSocket
计时器和工作器setTimeout、setInterval、setImmediate、Worker、importScripts、postMessage
运行时和全局变量Deno、process、globalThis、self、window、WebAssembly、Buffer

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"
});

使用代码片段​

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

“预请求脚本”面板提供以下模板,这些模板都在“预请求脚本”下分组:

  • 更新提供程序 URL — 将request_vendor_path设置为完整的 URL,并替换该请求的提供程序 URL。
  • 使用配置— 从configuration (在示例中为连接器的基本 URL)读取值,并将其作为请求标头发送到提供程序。
  • 跳过提供程序请求— 将continue设置为false ,以便永远不会向提供程序发送请求。

“请求后脚本”面板提供以下模板,这些模板都在“请求后脚本”下分组:

  • 更新响应正文— 将response_body复制到局部变量中,向其中添加字段,并返回修改后的正文。
  • 根据供应商元数据生成 SR 元数据— 从供应商元数据响应构建标准资源字段元数据,从而派生每个自定义字段的类型、格式、显示名称、说明、支持的方法和枚举值。

前请求脚本​

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

变量访问描述
request_method读取API 调用的 HTTP 方法( GET 、 POST等)。
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写入当continue为false时要返回的 HTTP 状态代码。
response_error_message写入在将请求发送给供应商之前返回的错误消息。
response_body写入当continue为false时要返回的响应正文。
response_body_raw写入当continue为false时,要以字符串形式返回的响应正文。
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()之后写入代码,此代码无法访问。
  • 检查null或undefined — 对于 GET 和 DELETE 请求, request_body和request_vendor_body是否为undefined 。
  • 使用continue: false进行短接— 直接返回响应,而不调用供应商。

此页面有帮助吗?

连接

需要帮助? 支持

想要了解详细内容? UiPath Academy

有问题? UiPath 论坛

保持更新