本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
HTTP_REQUEST
何时使用
HTTP_REQUEST当您的函数需要调用外部服务时使用。常见用例包括从解析提供商那里获取身份数据、从数据管理平台检索受众细分以及向日志端点发送会话信息。
配置字段
一个HTTP_REQUEST函数有以下字段:
-
运行时间-表达式语言。将其设置为
JSONATA。 -
MethodType— HTTP 方法。支持的值为
GET和POST。 -
网址-要将请求发送到的网址。您可以使用静态 URL 或 jsonata 表达式来动态构建 URL。
-
标头-请求中包含的 HTTP 标头,指定为标头名称和值对。对动态标头值使用
{%...%}表达式语法。静态值可以直接指定为字符串。 -
正文-要发送的请求正文。与
POST请求一起使用。你可以使用 jsonata 表达式来动态构建主体。 -
RequestTimeoutMilliseconds(必填)-等待回复的时间。
-
输出-定义 HTTP 调用完成后要生成的值。每个条目都将输出键(例如
player_params.envelope_id)映射到可以引用该response对象的表达式。
有关适用于这些字段的大小限制和限制,请参阅限制。
请求是如何处理的
MediaTailor 分两个步骤处理一个HTTP_REQUEST函数:
-
生成请求 — 根据当前 MediaTailor 会话状态评估
UrlHeaders、和Body表达式。这些评估值构成出站 HTTP 请求。 -
处理响应-HTTP 调用完成后, MediaTailor 计算输出块中的表达式。这些表达式既可以引用原始会话状态,也可以引用调用返回的
response对象。
响应字段
HTTP 调用完成后,您可以在输出表达式中引用以下字段:
| 字段 | Type | 说明 |
|---|---|---|
response.body |
对象或数组 | 响应正文解析为 JSON。null如果正文超过 20,000 个字符或者不是有效的 JSON,则设置为。 |
response.statusCode |
整数 | 外部服务返回的 HTTP 状态码。设置为 null “网络故障时”。 |
response.text |
字符串 | 原始响应正文为字符串,截断为 20,000 个字符。设置为 "Internal Error" “网络故障时”。 |
重要
该response.body字段表示响应超过 20,000 个字符,即使响应是有效的 JSON 也是如此。null
注意
响应对象仅在HTTP_REQUEST函数的 Output 块中可用。您不能在 “网址”、“标题” 或 “正文” 字段中引用响应字段。在 a 中SEQUENTIAL_EXECUTOR,每个HTTP_REQUEST函数只能访问自己的响应。
值为null表示数据不可用。当 HTTP 调用失败(网络错误或超时)或响应正文超过 20,000 个字符或不是有效的 JSON 时,就会发生这种情况。
网络故障行为
如果 HTTP 调用由于网络错误或超时而失败null,response.statusCoderesponse.body且设置为,response.text则设置为"Internal
Error"。您的输出表达式仍在运行,因此请务必response.statusCode在使用响应数据之前进行检查。
提示
使用条件表达式优雅地处理故障:{%response.statusCode = 200 ? response.body.value :
'default'%}
示例:获取身份数据
以下函数在会话开始时调用身份解析 API,并将结果存储在玩家参数中。它是为PRE_SESSION_INITIALIZATION生命周期挂钩设计的。
{ "FunctionId": "fetchIdentityEnvelope", "FunctionType": "HTTP_REQUEST", "HttpRequestConfiguration": { "Runtime": "JSONATA", "MethodType": "GET", "Url": "{%'https://identity.example.com/v1/resolve?ip=' & $encodeUrlComponent(session.client_ip)%}", "Headers": { "Authorization": "{%'Bearer my_api_token'%}", "Accept": "application/json" }, "RequestTimeoutMilliseconds": 2000, "Output": { "player_params.identity_envelope": "{%response.statusCode = 200 ? response.body.envelope : ''%}" } } }
有关类似示例的完整演练,请参阅函数示例。