> ## Documentation Index
> Fetch the complete documentation index at: https://docs.kasoftware.com/llms.txt
> Use this file to discover all available pages before exploring further.

# arc:call

> 使用 arc:call 关键字调用 ArcScript 运算器，包括内置运算器、自定义脚本和远程脚本。

export const siteNameShort = "知行之桥";

arc:call 关键字用来调用运算器。有效的运算器有以下几种：

* 与应用程序的 bin 子文件夹中的应用程序集一起安装的内置运算器
* 在 .NET 或 Java 中编写的运算器，并放置在应用程序 bin 子文件夹下
* 调用同一台计算机上现有的其它脚本
* 使用 HTTP 调用的远程计算机上的脚本

运算器将对象作为输入并返回对象集作为输出。在 arc:call 的作用域内，调用返回的对象集中每个对象都会被执行。在 arc:call 作用域中，可以检查和修改返回的对象中的属性。可以将这些运算器作为输入提供给另一个运算器，从而就形成了一个运算器管道。或者，也可以将对象作为输出。

## 输出对象堆栈和默认对象

每次执行 arc:call 时，一个新对象会被推入到一个内部的对象堆栈中。在堆栈顶部的对象就是默认的对象。当未在调用输入中明确指定对象名称时，该对象为 arc:call 提供输入。

被调用的运算器将属性写入到默认的对象中，[arc:push](./op-arc-push) 将默认的对象输出。当推送一个对象时，只有在堆栈顶部的，默认对象的属性会被推送。

在一个对象被迭代后，默认的对象会被清除，然后 arc:call 可以处理下一个对象。这意味着将不能在下一次 arc:call 迭代中读取上一次迭代中设置的值。要在迭代中保留值，可以使用 [arc:set](./op-arc-set) 将其复制到一个已命名的对象。

可以将默认对象命名为 \_ ，或显式命名为 \_out1, \_out2, \_out\[n]，其中N 是堆栈的深度。这就使得在执行过程中读取所有可用的值。查找过程从默认对象开始，并继续在堆栈中查找，直到找到一个值。

在下面的例子中，可以看到每次调用是如何将对象推到堆栈的顶部的，以及默认对象在每次调用的作用域内是如何变化的：

```xml theme={null}
<arc:call op="operation1"> 
The default item here is _out1 
A push here would push the attributes from _out1 
The input item used to call operation2 is also _out1 
<arc:call op="operation2"> 
The default item here is _out2 
A push here will push the attributes from _out2 
If there was another arc:call here the input item used would be _out2 
_out2 is swept clean here for the next iteration 
</arc:call> 
The default item here is again _out1 
A push here would again push the attributes from _out1 
The input item at this level is again _out1 
_out1 is swept clean here for the next iteration 
</arc:call> 
```

## 指定运算器的输入

有三种方式可以为 call 提供输入：

* 默认对象：如果输入的对象未指定，被调用的运算器会从默认对象中读取输入值。可以使用 [arc:set](./op-arc-set) 关键字设置默认对象中的值，这样就可以被调用的运算器处理。
  ```xml theme={null}
  <arc:set attr="mask" value="*.txt"/>
  <arc:set attr="path" value="C:\\"/>
  <arc:call op="fileListDir">
  ... 
  </arc:call>
  ```

* 显式输入对象：不使用默认对象，可以使用 **in** 参数来显式指定要用作运算器输入的对象。如果选择这样做，则不再使用默认对象，并且将从指定的输入对象中读取输入值，如下所示，将查询字符串传递给运算器。
  ```xml theme={null}
  <arc:set attr="mask" value="*.* -- Will be ignored --"/>
  <arc:set attr="myinput.mask" value="*.txt"/>
  <arc:set attr="myinput.path" value="C:\\"/>
  <arc:call op="fileListDir" in="myinput">
  ... 
  </arc:call>
  ```

* 查询字符串参数：还可以使用查询字符串符号指定运算器的输入。指定为查询字符串一部分的属性具有优先级。因此，如果查询字符串中指定的属性与输入对象中的属性之间存在名称冲突，则首选查询字符串中的属性。但是，输入对象的其它属性仍然可以访问。下面的示例显示了在查询字符串中指定输入的语法：
  ```xml theme={null}
  <arc:set attr="myinput.mask" value="*.txt -- will be overridden --"/> 
  <arc:set attr="myinput.path" value="C:\\"/> 
  <arc:call op="fileListDir?mask=*.rsb" in="myinput">
  ...
  </arc:call>
  ```

## 参数

* **op**：被调用的运算器的名称。

* **in\[put]**：调用运算器时用作输入的对象列表。在指定的输入对象中从左到右查找属性。

* **out\[put]**：放置输出属性的对象。在 arc:call 作用域内，可以使用此处指定的对象名称来检索当前输出项对象。也可以使用 \_out\[n] 或 \_pipe 引用调用结果。

  <Note>在调用中设置的属性在调用作用域外是不可用的。这是因为调用的每次迭代都会删除上一次迭代的属性；在调用结束后不会留下任何东西。要在调用的作用域之外访问属性，使用 [arc:set](./op-arc-set) 去显式将属性复制到想在调用之外使用的对象中。</Note>

* **item**：用于输入和输出的对象名称。

* **sep\[arator]**：用来分隔多个输入对象的分隔符。默认为逗号。

* **ignoreprefix**：以逗号分隔的前缀列表，当查询到时将被忽略。一些运算器返回名称形式为 “prefix:name” 的属性（例如，arc:operation 和 sql:company）。在某些情况下，可能需要将 prefix:name 和 name 当作同一个属性。

* **page and pagesize**：被迭代的对象的子集。用于启用运算器或对象集结果的分页。例如。如果指定 page="2" 且 pagesize="5"，arc:call 关键字仅对生成对象集的对象6到10进行迭代。

* **httpmethod**：运算器将使用的 HTTP 方法。

* **authtype**：通过 HTTP 访问对象集的所需的身份验证类型。例如，“basic”或“digest”。

* **authtoken**：通过 HTTP 访问对象集所需的身份验证的认证令牌。

* **user**：通过 HTTP 访问对象集所需的身份验证的用户名。

* **password**：通过 HTTP 访问对象集所需的身份验证的密码。

* **http\_headers**: 通过 HTTP 访问对象集所需的其它 HTTP 头部。

* **proxyhost**：发送 HTTP 请求的代理地址。

* **proxyport**：HTTP 代理正在运行的 TCP 端口。

* **proxyuser**：用于验证 HTTP 代理的用户名。

* **proxypassword**：用于验证 HTTP 代理的密码。

* **proxyauthtype**：代理所需的 HTTP 认证类型。例如，“basic” 或 “digest”。

* **proxyssltype**：当连接代理服务器时使用的 TLS／SSL 类型。有效值有 AUTO，ALWAYS，NEVER 或 TUNNEL。默认值为 AUTO。

## 控制属性

* **\_index**：arc:call 当前正在迭代的对象的索引。
* **\_op**：被调用的运算器的名称。如果在执行之前不知道运算器的名称，这将很有帮助。
* **\_separator**：用来分隔多个输入对象的分隔符。

## 示例

使用默认对象作为输入调用一个运算器：

```xml theme={null}
<arc:set attr="path" value="C:\myfiles"/>
<arc:call op="fileListDir">
  <arc:push/>
</arc:call>
```

在远程计算机上调用另一个脚本。如上面的示例所示，脚本是嵌套的。

```xml theme={null}
<arc:call op="http://someplace.com/customerList.rsb">
  <arc:push/>
</arc:call>
```

## 另请参阅

* [arc:first](./op-arc-first)：编写只在调用的第一次迭代中执行的元素。
* [arc:catch](./op-arc-catch)：在调用中捕获错误。
* [arc:continue](./op-arc-continue)：继续下一次迭代。
