¿Es posible utilizar claves calculadas con KeyValueMaps?
-
20-12-2019 - |
Pregunta
Me gustaría usar KeyValueMaps para almacenar algunos valores simples, pero las claves que necesito usar se calcularían en tiempo de ejecución.Por ejemplo, en mis 'Entradas Iniciales' quiero hacer algo como esto:
<KeyValueMapOperations async="false" continueOnError="false" enabled="true" name="Sandbox-Read-Count">
<DisplayName>Sandbox - Read Count</DisplayName>
<FaultRules/>
<Properties/>
<ExclusiveCache>false</ExclusiveCache>
<ExpiryTimeInSecs>-1</ExpiryTimeInSecs>
<InitialEntries>
<Entry>
<Key>
<Parameter>{variable}.sandbox.calls</Parameter>
</Key>
<Value>0</Value>
</Entry>
</InitialEntries>
<Scope>apiproxy</Scope>
</KeyValueMapOperations>
Sin embargo, al hacer esto me sale un error al intentar guardar la política:
Error while Uploading file for API Test.
messaging.config.beans.InvalidBundle. Errors:[Entity : policy-Sandbox-Read-Count, Invalid Key Names For Entries: [{apikey}.sandbox.calls];]
¿Es posible utilizar valores calculados en la política KeyValueMap?¿Existe una sintaxis diferente que debería usar?
Solución
He investigado esto.Lo que sucede es cuando guardas el proxy con InitialEntries
en el KVM con ámbito de apiproxy, el KVM se crea inmediatamente con las entradas iniciales.Por lo tanto, no hay forma de utilizar variables de tiempo de ejecución, porque el cebado del KVM se produjo antes de que se ejecutara el proxy.
No usaste el mapIdentifier
campo en su elemento KeyValueMapOperations (mire el Ejemplo de PUT de KeyValueMap en los documentos de Apigee), por lo que el KVM que crearía se llamaría kvmap
.
Puedes usar lo siguiente llamada API de gestión para obtener una lista de los KVM y su contenido para un apiproxy determinado:
GET https://api.enterprise.apigee.com/v1/o/{org}/apis/{apiname}/keyvaluemaps?expand=true
Authorization: Basic {base64 username:password}
Desde el InitialEntries
La sección solo se usa cuando el proxy se carga exitosamente por primera vez (incluso si cambia la sección InitialEntries y la vuelve a implementar, no se realizarán cambios si el KVM con ese nombre ya existe), creo que la utilidad de la InitialEntries
La sección es bastante limitada.Recomiendo preparar manualmente sus KVM usando el API de administración para inicializar el KVM:
PUT https://api.enterprise.apigee.com/v1/o/{org}/apis/{apiname}/keyvaluemaps
Authorization: Basic {base64 username:password}
Content-Type: application/json
{
"entry" : [ {
"name" : "key",
"value" : "0"
} ],
"name" : "{kvmName}"
}