Как разрешить дополнительный ключ в шаблоне сопоставления шлюза API - PullRequest
0 голосов
/ 27 марта 2020

У меня есть шлюз API, который сканирует таблицу DynamoDB. Я хочу передать LastEvaluatedKey в моем теле запроса; если я передаю LastEvaluatedKey, тогда все работает, и я получаю ответ с ожидаемыми данными - так что я на полпути.

Но, конечно, первый раз, когда я отправляю запрос в API LastEvaluatedKey не будет существовать, поэтому ExclusiveStartKey в шаблоне сопоставления, который ожидает LastEvaluatedKey, должен быть необязательным. Я пробовал несколько разных способов сделать это необязательным, но пока ничего не получалось. Вот что у меня есть:

#set($hasName = $input.json('$.Name'))
{
    "TableName": "MyTable",
    #if($hasName && $hasName.length() != 0)
    "ExclusiveStartKey": {
        "Name": {
            "S": $input.json('$.Name')
        },
        "Date": {
            "S": $input.json('$.Date')
        }
    },#end
    "FilterExpression": "begins_with(#dt, :tdt)",
    "ExpressionAttributeNames": {
        "#dt": "Date"
    },
    "ExpressionAttributeValues": {
        ":tdt": {
            "S": "$input.params('date')"
        }
    }
}

Как я уже сказал, вышесказанное работает, когда я делаю передать LastEvaluatedKey в моем теле запроса, но когда я не получаю, я получаю ошибку:

{
    "__type": "com.amazon.coral.validate#ValidationException",
    "message": "The provided starting key is invalid: One or more parameter values were invalid: An AttributeValue may not contain an empty string"
}

... все еще ожидается, что LastEvaluatedKey

Я также попытался обернуть Name и Date внутри, если #if, но безуспешно. Я получил вдохновение от других ответов, таких как: это и это , но не повезло.

1 Ответ

0 голосов
/ 02 апреля 2020

в моем примере 'cursor' - это LastEvaluatedKey:

#set($hasCursor = $input.params('cursor') != "")
{
    "TableName": "my-table"
    #if($hasCursor) "ExclusiveStartKey":$util.base64Decode("$input.params('cursor')")
    #end
}

Он просто проверяет, передан ли 'cursor' в качестве параметра запроса (например, / my / api? Cursor = myencodedlastevaluatedkey), и добавляет только ExclusiveStartKey к запросу, если он есть.

...