ALB 転送ルールでは、リクエスト処理時にキーと値のペアを格納および操作するための辞書データ構造がサポートされています。一連の if/else 比較を使わずに、動的ルートロジックの構築、操作間での状態の受け渡し、または解析済み M3U8 プレイリストなどの構造化データの処理に、辞書関数をご利用ください。
set
| Item | Description |
|---|---|
| 構文 | set(d, k, v) |
| 説明 | 辞書 d にキーと値のペアを設定します。 |
| パラメーター | d:辞書。k:キー(任意の型)。v:値(任意の型)。 |
| 戻り値 | true |
例 1: 数値インデックスを使用する辞書と文字列キーを使用する辞書を初期化し、foreach を使って文字列キーの辞書を反復処理します。
outer_keys=['e66fd4aa-f281-472f-b919-fc7e7474de25', '66fee78d-1887-42ec-9119-a9b50b7fbca2']
say(concat('keys[1]=', get(outer_keys, 1)))
say(concat('keys[2]=', get(outer_keys, 2)))
inner_keys=[]
set(inner_keys, 'dev', '243390eb-00b7-4551-a6b8-021bb34d1674')
set(inner_keys, 'zeus', '4747d33b-12b0-45e6-ac10-a8e191d6adaa')
def echo_each(k, v, u) {
s = concat('keys[', k, ']=', v)
say(s)
}
foreach(inner_keys, echo_each, [])出力:
keys[1]=e66fd4aa-f281-472f-b919-fc7e7474de25
keys[2]=66fee78d-1887-42ec-9119-a9b50b7fbca2
keys[dev]=243390eb-00b7-4551-a6b8-021bb34d1674
keys[zeus]=4747d33b-12b0-45e6-ac10-a8e191d6adaa例 2: ネストされた辞書(d_outer 内の d_inner)を格納し、内側の辞書から値を読み取ります。
d_inner = []
set(d_inner, 'name', 'inner ascript')
d_outer = []
set(d_outer, 'dictA', d_inner)
v = get(d_outer, 'dictA')
if v {
v = get(v, 'name')
if v {
add_rsp_header('X-DSL-NESTED-DICT', v)
}
}出力:
X-DSL-NESTED-DICT: inner dslget
| Item | Description |
|---|---|
| 構文 | get(d, k) |
| 説明 | 辞書 d からキーに対応する値を取得します。 |
| パラメーター | d:辞書。k:キー(任意の型)。 |
| 戻り値 | キーが存在する場合はその値、存在しない場合は false を返します。 |
例 1: 数値インデックスおよび文字列キーを使用する辞書から値を取得します。
outer_keys=['e66fd4aa-f281-472f-b919-fc7e7474de25', '66fee78d-1887-42ec-9119-a9b50b7fbca2']
say(concat('keys[1]=', get(outer_keys, 1)))
say(concat('keys[2]=', get(outer_keys, 2)))
inner_keys=[]
set(inner_keys, 'dev', '243390eb-00b7-4551-a6b8-021bb34d1674')
set(inner_keys, 'zeus', '4747d33b-12b0-45e6-ac10-a8e191d6adaa')
def echo_each(k, v, u) {
s = concat('keys[', k, ']=', v)
say(s)
}
foreach(inner_keys, echo_each, [])出力:
keys[1]=e66fd4aa-f281-472f-b919-fc7e7474de25
keys[2]=66fee78d-1887-42ec-9119-a9b50b7fbca2
keys[dev]=243390eb-00b7-4551-a6b8-021bb34d1674
keys[zeus]=4747d33b-12b0-45e6-ac10-a8e191d6adaa例 2: ネストされた辞書から値を読み取り、キーが存在しない場合に備えて if v でチェックを行います。
d_inner = []
set(d_inner, 'name', 'inner ascript')
d_outer = []
set(d_outer, 'dictA', d_inner)
v = get(d_outer, 'dictA')
if v {
v = get(v, 'name')
if v {
add_rsp_header('X-DSL-NESTED-DICT', v)
}
}出力:
X-DSL-NESTED-DICT: inner dslforeach
| Item | Description |
|---|---|
| 構文 | foreach(d, f, user_data) |
| 説明 | 辞書 d の各要素を走査し、各要素に対してコールバック関数 f を呼び出します。f が false を返すと、ループは早期終了します。 |
| パラメーター | d:辞書。f:コールバック関数。シグネチャは f(key, value, user_data) です。user_data:各コールバック呼び出しに渡される辞書。 |
| 戻り値 | true |
例 1: 文字列キーの辞書を反復処理し、各キーと値のペアを出力します。
outer_keys=['e66fd4aa-f281-472f-b919-fc7e7474de25', '66fee78d-1887-42ec-9119-a9b50b7fbca2']
say(concat('keys[1]=', get(outer_keys, 1)))
say(concat('keys[2]=', get(outer_keys, 2)))
inner_keys=[]
set(inner_keys, 'dev', '243390eb-00b7-4551-a6b8-021bb34d1674')
set(inner_keys, 'zeus', '4747d33b-12b0-45e6-ac10-a8e191d6adaa')
def echo_each(k, v, u) {
s = concat('keys[', k, ']=', v)
say(s)
}
foreach(inner_keys, echo_each, [])出力:
keys[1]=e66fd4aa-f281-472f-b919-fc7e7474de25
keys[2]=66fee78d-1887-42ec-9119-a9b50b7fbca2
keys[dev]=243390eb-00b7-4551-a6b8-021bb34d1674
keys[zeus]=4747d33b-12b0-45e6-ac10-a8e191d6adaa例 2: M3U8 プレイリストから最初の 2 つの .ts セグメントを出力し、ループを早期終了します。コールバック関数は user_data 内でカウンターを管理し、2 つの .ts エントリが出力された時点で false を返します。
def echo_each(k, v, u) {
say(v)
if match(v, '.*ts') {
ts_cnt = get(u, 'ts_cnt')
ts_cnt = add(ts_cnt, 1)
set(u, 'ts_cnt', ts_cnt)
if ge(ts_cnt, 2) {
return false
}
}
}
m3u8 = ''
m3u8 = concat(m3u8, '#EXTM3U8', '\n')
m3u8 = concat(m3u8, '#EXT-X-MEDIA-SEQUENCE:140651513\n')
m3u8 = concat(m3u8, '#EXT-X-TARGETDURATION:10\n')
m3u8 = concat(m3u8, '#EXTINF:8,\n')
m3u8 = concat(m3u8, 'http://vapp1.fw.live.cntv.cn/cache/289_/seg0/index140651514_140651513.ts\n')
m3u8 = concat(m3u8, '#EXTINF:9,\n')
m3u8 = concat(m3u8, 'http://vapp1.fw.live.cntv.cn/cache/289_/seg0/index140651514_140651514.ts\n')
m3u8 = concat(m3u8, '#EXTINF:10,\n')
m3u8 = concat(m3u8, 'http://vapp1.fw.live.cntv.cn/cache/289_/seg0/index140651514_140651515.ts\n')
lines = split(m3u8, '\n')
u = []
set(u, 'ts_cnt', 0)
foreach(lines, echo_each, u)出力:
#EXTM3U8
#EXT-X-MEDIA-SEQUENCE:140651513
#EXT-X-TARGETDURATION:10
#EXTINF:8,
http://vapp1.fw.live.cntv.cn/cache/289_/seg0/index140651514_140651513.ts
#EXTINF:9,
http://vapp1.fw.live.cntv.cn/cache/289_/seg0/index140651514_140651514.tsdel
| Item | Description |
|---|---|
| 構文 | del(d, k) |
| 説明 | 辞書 d からキーと値のペアを削除します。 |
| パラメーター | d:辞書。k:キー(任意の型)。 |
| 戻り値 | true |
例: キーを設定し、その存在を確認した後、キーを削除して再度存在確認を行います。レスポンスヘッダーは両方の状態を反映します。
var_a = []
set(var_a, 'note_a', 'note a info')
if get(var_a, 'note_a') {
add_rsp_header('X-RESPOND-OUTPUT', 'found var_a key', true)
} else {
add_rsp_header('X-RESPOND-OUTPUT', 'del var_a key', true)
}
del(var_a, 'note_a')
if get(var_a, 'note_a') {
add_rsp_header('X-RESPOND-OUTPUT', 'found var_a key', true)
} else {
add_rsp_header('X-RESPOND-OUTPUT', 'del var_a key', true)
}出力:
X-RESPOND-OUTPUT: found var_a key
X-RESPOND-OUTPUT: del var_a key