#aws-api-gateway #vtl #apache-velocity
Вопрос:
У меня есть шлюз API AWS, в который я могу отправлять данные — данные помещаются в поток данных Kinesis для доставки в различные хранилища данных. Я хотел бы захватить пользовательский агент и добавить его к данным. Поскольку я уже собирал данные в определенном формате, я бы не хотел слишком сильно изменять формат — вместо того, чтобы помещать данные в родительский объект, я бы хотел просто добавить еще один ключ/значение в объект данных для агента пользователя.
До сих пор мой шаблон отображения выглядит следующим образом:
#set($payload = "$input.json('
Когда я тестирую его с помощью утилиты тестирования AWS API Gateway, я отправляю запрос с таким телом , как { "foo": "bar" }
, и результаты показывают:
Thu Jun 03 20:31:53 UTC 2021 : Endpoint request body after transformations: {
"StreamName": "<stream-name>",
"Data": "eyJmb28iOiJiYXIifQ==",
"PartitionKey": "test-invoke-source-ip",
"UserAgent": "aws-internal/3 aws-sdk-java/1.11.1014 Linux/5.4.102-52.177.amzn2int.x86_64 OpenJDK_64-Bit_Server_VM/25.292-b10 java/1.8.0_292 vendor/Oracle_Corporation cfg/retry-mode/legacy"
}
"eyJmb28iOiJiYXIifQ=="
когда декодируется { "foo": "bar" }
, значит, агент пользователя не настраивается. Но я знаю, что "$context.identity.userAgent"
это не ноль, так как он отображается как UserAgent
ключ, он просто не привязывается к $payload
объекту.
Документы VTL Apache Velocity Engine указывают, что вы должны иметь возможность изменять свойство объекта:
#set - Establishes the value of a reference
Format:
# [ { ] set [ } ] ( $ref = [ ", ' ] arg [ ", ' ] )
Usage:
$ref - The LHS of the assignment must be a variable reference or a property reference.
arg - The RHS of the assignment, arg is parsed (i.e. interpolated) if enclosed in double quotes, and not parsed if enclosed in single quotes. If the RHS evaluates to null, it is not assigned to the LHS.
...
Property reference: #set( $monkey.Blame = $whitehouse.Leak )
Есть идеи, что здесь происходит?
)")
#set($payload.UserAgent = "$context.identity.userAgent")
{
"StreamName": "<stream-name>",
"Data": "$util.base64Encode($payload)",
"PartitionKey": "$context.identity.sourceIp",
"UserAgent": "$context.identity.userAgent"
}
Когда я тестирую его с помощью утилиты тестирования AWS API Gateway, я отправляю запрос с таким телом , как { "foo": "bar" }
, и результаты показывают:
"eyJmb28iOiJiYXIifQ=="
когда декодируется { "foo": "bar" }
, значит, агент пользователя не настраивается. Но я знаю, что "$context.identity.userAgent"
это не ноль, так как он отображается как UserAgent
ключ, он просто не привязывается к $payload
объекту.
Документы VTL Apache Velocity Engine указывают, что вы должны иметь возможность изменять свойство объекта:
Есть идеи, что здесь происходит?