

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 示例 4：二级广告服务器备用
<a name="monetization-functions-examples-backup-ads"></a>

## 场景
<a name="monetization-functions-examples-backup-ads-scenario"></a>

您的主广告返回的广告有时会少于广告插播时间所能容纳的广告。发生这种情况时，你想从辅助广告服务器获取更多广告并将其附加到广告列表中，这样额外的广告就可以填满剩余的时间。

此示例使用`POST_ADS_RESPONSE`生命周期挂钩。一个`VAST_REQUEST`函数获取二级广告，然后`SEQUENTIAL_EXECUTOR`编排流程。执行器的输出块将提取的广告附加到广告列表中，当主响应已经有足够的广告时，它会完全`RunCondition`跳过二次提取。

## 功能配置
<a name="monetization-functions-examples-backup-ads-config"></a>

**提取函数 (`fetchBackupAds`)：**

```
{
    "FunctionId": "fetchBackupAds",
    "FunctionType": "VAST_REQUEST",
    "VastRequestConfiguration": {
        "Runtime": "JSONATA",
        "MethodType": "GET",
        "Url": "{%'https://backup-ads.example.com/vast?sid=' & session.uuid%}",
        "Headers": {
            "Accept": "application/xml"
        },
        "RequestTimeoutMilliseconds": 1000,
        "Output": {
            "temp.backupAds": "{%response.parsedAds%}"
        }
    }
}
```

**序列 (`backupAdsFallback`): **

```
{
    "FunctionId": "backupAdsFallback",
    "FunctionType": "SEQUENTIAL_EXECUTOR",
    "SequentialExecutorConfiguration": {
        "Runtime": "JSONATA",
        "TimeoutMilliseconds": 2000,
        "FunctionList": [
            { "FunctionId": "fetchBackupAds", "RunCondition": "{%$count(adsResponse.ads) < 3%}" }
        ],
        "Output": {
            "adsResponse.ads": "{%$count(adsResponse.ads) < 3 ? $append(adsResponse.ads, temp.backupAds)[] : adsResponse.ads[]%}"
        }
    }
}
```

## 函数映射
<a name="monetization-functions-examples-backup-ads-mapping"></a>

```
{
    "FunctionMapping": {
        "POST_ADS_RESPONSE": "backupAdsFallback"
    }
}
```

## 在运行时会发生什么
<a name="monetization-functions-examples-backup-ads-runtime"></a>

1. MediaTailor 接收并解析主 ADS 响应，然后触发`POST_ADS_RESPONSE`生命周期挂钩。

1. 如果主要响应包含少于 3 个广告，则`RunCondition`会评估`true`并`fetchBackupAds`调用辅助广告服务器。 MediaTailor 然后将响应解析为 VAST，解析包装器重定向，并将解析后的广告写入。`temp.backupAds`

1. 如果主回复已经有 3 个或更多广告，则会跳过提取，`temp.backupAds`也不会进行设置。

1. 序列的输出块将合并后的广告列表写入`adsResponse.ads`。跳过提取操作时，该条件将采用`else`分支并按原样返回原始广告。由于辅助广告是在同一个挂钩调用中由`VAST_REQUEST`函数解析的，因此在选择广告之前会 MediaTailor恢复每个附加广告的完整 VAST 数据。

1. 广告选择将按照合并列表进行。如果二次提取失败，`temp.backupAds`则为空数组，原始广告列表将保持不变。

**注意**  
输出表达式`[]`中的尾部是必填的。如果没有数组强制，生成零个或一个广告的表达式不会生成数组，输出将被丢弃或误用。有关更多信息，请参阅 [Post-ads 回应](monetization-functions-hooks-post-ads.md)。

有关此示例中使用的字段的更多信息，请参阅[VAST 请求](monetization-functions-types-vast-request.md)和[Post-ads 回应](monetization-functions-hooks-post-ads.md)。