Los decoradores de Cloud Endpoints Frameworks para Python describen la configuración de la API, los métodos, los parámetros y otros detalles importantes que definen las propiedades y el comportamiento del endpoint.
En esta página se describen los decoradores disponibles en detalle. Para obtener información sobre cómo usar los decoradores para crear tu API, consulta lo siguiente:
Definir la API (@endpoints.api
)
Puedes proporcionar varios argumentos a @endpoints.api
para definir tu API. En la siguiente tabla se describen los argumentos disponibles:
Argumentos de @endpoints.api | Descripción | Ejemplo |
---|---|---|
allowed_client_ids |
Obligatorio si tu API usa autenticación. Lista de IDs de cliente de los clientes que pueden solicitar tokens. Para obtener más información, consulta IDs de cliente y audiencias permitidos. | allowed_client_ids=['1-web-apps.apps.googleusercontent.com','2-android-apps.apps.googleusercontent.com', endpoints.API_EXPLORER_CLIENT_ID ] |
api_key_required |
Opcional. Se usa para restringir el acceso a las solicitudes que proporcionan una clave de API. | api_key_required=True |
audiences |
Obligatorio si tu API requiere autenticación y si admites clientes Android. En el caso de los tokens de ID de Google, puede ser una lista de IDs de cliente en cuyo nombre se solicitan los tokens. Si los tokens los emiten proveedores de autenticación de terceros, como Auth0, debe ser un diccionario que asigne nombres de emisores de autenticación a listas de audiencias. Para obtener más información, consulta IDs de cliente y audiencias permitidos. | audiences=['1-web-apps.apps.googleusercontent.com'] o audiences={"auth0": ["aud-1.auth0.com", "aud-2.auth0.com"]} |
base_path |
Opcional. Se usa para publicar tu API desde la ruta especificada. Si especifica este argumento, también debe cambiar la sección handlers del archivo app.yaml . |
Consulta Servir tu API desde otra ruta. |
canonical_name |
Opcional. Se usa para especificar un nombre diferente o más legible para la API en la biblioteca de cliente. Este nombre se usa para generar nombres en la biblioteca de cliente. La API backend sigue usando el valor especificado en la propiedad name .Por ejemplo, si tu API tiene el valor name definido como dfaanalytics, puedes usar esta propiedad para especificar el nombre canónico DFA Group Analytics. Las clases de cliente generadas contendrían el nombre DfaGroupAnalytics .Debes incluir los espacios correspondientes entre los nombres, tal como se muestra. Estos se sustituyen por el formato camel case o por guiones bajos. |
canonical_name='DFA Analytics' |
description |
Una breve descripción de la API. Se expone en el servicio de descubrimiento para describir tu API y, opcionalmente, también se puede usar para generar documentación, tal como se describe en Generar bibliotecas de cliente. | description='Sample API for a simple game' |
documentation |
Opcional. URL donde los usuarios pueden encontrar documentación sobre esta versión de la API. Esta información se muestra en la sección "Más información" del explorador de APIs, situada en la parte superior de la página, para que los usuarios puedan obtener información sobre tu servicio. | documentation='http://link_to/docs' |
hostname |
El nombre de host de tu aplicación de App Engine. La herramienta de línea de comandos de Endpoints Frameworks usa el valor que especifiques aquí cuando genera un documento de Discovery o un documento de OpenAPI. Si no especificas el nombre de host aquí, debes hacerlo en el campo application de tu archivo app.yaml o especificar el ID de tu proyecto al implementar tu aplicación App Engine. |
hostname='your_app_id.appspot.com' |
issuers |
Opcional. Las configuraciones personalizadas de la entidad emisora de JWT. Debe ser un diccionario que asigne nombres de emisores a objetos endpoints.Issuer . |
issuers={"auth0": endpoints.Issuer("https://test.auth0.com", "https://test.auth0.com/.well-known/jwks.json")} |
name |
Obligatorio. El nombre de la API, que se usa como prefijo de todos los métodos y rutas de la API. El valor de name :
[a-z][a-z0-9]{0,39} . Es decir, el nombre debe empezar por una letra minúscula, el resto de los caracteres deben ser letras minúsculas o números, y la longitud máxima es de 40 caracteres. |
name='yourApi' o name='yourapi' |
limit_definitions |
Opcional. Se usa para definir cuotas para tu API. Consulta limit_definitions para obtener más información. | |
owner_domain |
Opcional. Nombre de dominio de la entidad propietaria de la API. Se usa junto con owner_name para proporcionar sugerencias sobre cómo nombrar correctamente la biblioteca de cliente cuando se genera para esta API. La ruta del paquete es la inversa de owner_domain y package_path , si se proporcionan. El valor predeterminado es appid.apppost.com . |
owner_domain='your-company.com' |
owner_name |
Opcional. Nombre de la entidad propietaria de la API. Se usa junto con owner_domain para proporcionar sugerencias sobre cómo nombrar correctamente la biblioteca de cliente cuando se genera para esta API. |
owner_name='Your-Company' |
package_path |
Opcional. Se usa para acotar aún más el "paquete" al que pertenece esta API. Los valores se separan por / para especificar agrupaciones lógicas de APIs.Por ejemplo, si se especifica cloud/platform , la ruta de la biblioteca de cliente se define como cloud/platform/<ApiName> y el paquete de la biblioteca de cliente se define como cloud.plaform.<ApiName> . |
package_path='cloud/platform' |
scopes |
Si no se proporciona, el valor predeterminado es el ámbito de correo electrónico (https://www.googleapis.com/auth/userinfo.email ), que es obligatorio para OAuth. Puedes anular este valor para especificar más permisos de OAuth 2.0 si quieres. También puedes anular los permisos especificados aquí para un método de API concreto especificando otros permisos en el decorador @endpoints.method . Sin embargo, si define más de un ámbito, tenga en cuenta que la comprobación del ámbito se supera si el token se genera para cualquiera de los ámbitos especificados. Para requerir varios permisos, especifica una sola cadena con un espacio entre cada permiso. |
scopes=['ss0', 'ss1 and_ss2'] |
title |
Opcional. El texto que se muestra en el Explorador de APIs como título de tu API y que se expone en los servicios de descubrimiento y de directorio. | title='My Backend API' |
version |
Obligatorio. Especifica la versión de Cloud Endpoints. Este valor aparece en la ruta de la API. Si especifica una cadena de versión compatible con el estándar SemVer, solo aparecerá el número de versión principal en la ruta de su API cuando la implemente. Por ejemplo, una API llamada echo con la versión 2.1.0 tendría una ruta similar a /echo/v2 . Si actualizas la API echo a la versión 2.2.0 y despliegas un cambio retrocompatible, la ruta sigue siendo /echo/v2 . Esto le permite actualizar el número de versión de la API cuando haga un cambio compatible con versiones anteriores sin romper las rutas actuales de sus clientes. Sin embargo, si actualizas la API echo a la versión 3.0.0 (porque vas a implementar un cambio incompatible), la ruta se cambiará a /echo/v3 . |
version='v1' o version='2.1.0' |
limit_definitions
Para definir cuotas para tu API, especifica el argumento opcional limit_definitions
en @endpoints.api
. Para configurar una cuota, también debes hacer lo siguiente:
- Instala la versión 2.4.5 o una posterior de la biblioteca Endpoints Frameworks.
- Añade el argumento
metric_costs
al decorador de método de cada método al que quieras aplicar una cuota.
Consulta Configurar cuotas para ver todos los pasos necesarios para configurar una cuota.
Especifica una lista de una o varias instancias de LimitDefinition
, como la siguiente:
quota_limits = [
endpoints.LimitDefinition(
"name",
"Display name",
limit)
]
Cada instancia de LimitDefinition
debe tener los siguientes valores:
Elemento | Descripción |
---|---|
name | Nombre del contador de solicitudes de API. Normalmente, se trata del tipo de solicitud (por ejemplo, "read-requests" o "write-requests") que identifica la cuota de forma única. |
Nombre visible | Texto que se muestra para identificar la cuota en la pestaña Cuotas de la página Endpoints > Services (Endpoints > Servicios). Este texto también se muestra a los consumidores de tu API en la página Cuotas de IAM y administración, y de APIs y servicios. El nombre visible debe tener un máximo de 40 caracteres. Para que sea más fácil de leer, el texto "por minuto y por proyecto" se añade automáticamente al nombre visible de las páginas Cuotas. Para mantener la coherencia con los nombres visibles de los servicios de Google que aparecen en las páginas de cuotas que ven los consumidores de tu API, te recomendamos que sigas estas directrices para el nombre visible:
|
límite | Valor entero que representa el número máximo de solicitudes por minuto y por proyecto de consumidor de la cuota. |
Ejemplo
quota_limits = [ endpoints.LimitDefinition('read-requests', 'Read Requests', 1000), endpoints.LimitDefinition('list-requests', 'List Requests', 100), endpoints.LimitDefinition('write-requests', 'Write Requests', 50) ] @endpoints.api(name='bookstore', version='v1', limit_definitions=quota_limits)
ID de clientes y audiencias permitidos
En la autenticación de OAuth2, se emite un token de OAuth2 para un ID de cliente específico, lo que significa que este ID de cliente se puede usar para restringir el acceso a tus APIs.
Cuando registras aplicaciones Android en la Google Cloud consola,
crea un ID de cliente para ella. Este ID de cliente es el que solicita un token de OAuth2 a Google con fines de autenticación. Cuando la API de backend está protegida
por autenticación, Endpoints Frameworks para App Engine envía y abre un token de acceso de OAuth 2.0, extrae el ID de cliente del token y, a continuación, compara el ID con la lista de IDs de cliente aceptables declarada por el backend (la lista allowed_client_ids
).
La lista allowed_client_ids
debe incluir todos los IDs de cliente que hayas obtenido a través de la Google Cloud console para tus aplicaciones web, Android y otras aplicaciones cliente. Esto significa que los clientes deben conocerse en el momento de compilar la API. Si especificas una lista vacía, ningún cliente podrá acceder a la API.
Ten en cuenta que, en cada método de la API en el que quieras comprobar que la autenticación es correcta, debes llamar a endpoints.get_current_user()
.
Consulta más información sobre cómo autenticar usuarios.
Si usas el argumento allowed_client_ids
y quieres probar las llamadas autenticadas a tu API mediante el Explorador de APIs, debes proporcionar su ID de cliente en la lista de allowed_client_ids
especificando la constante endpoints.API_EXPLORER_CLIENT_ID
. Ten en cuenta que, si allowed_client_ids
solo contiene endpoints.API_EXPLORER_CLIENT_ID
y despliegas tu API, esta seguirá siendo visible y accesible públicamente en el Explorador de APIs.
Acerca de las audiencias
La lista allowed_client_ids
protege la API de backend frente a clientes no autorizados. Sin embargo, se necesita más protección para proteger a los clientes, de modo que su token de autenticación solo funcione con la API backend prevista. En el caso de los clientes Android, este mecanismo es el argumento audiences
, en el que se especifica el ID de cliente de la API de backend.
Ten en cuenta que, al crear un proyecto de consola, se crea automáticamente un ID de cliente predeterminado con el nombre del proyecto para que lo use. Google Cloud Cuando subes tu API backend a App Engine, esta usa ese ID de cliente. Es el ID de cliente web que se menciona en la autenticación de la API.
Emisor de tokens de autenticación de terceros
Si tu aplicación acepta tokens de autenticación que no son tokens de ID de Google y que emiten terceros, debes definir correctamente los argumentos audiences
y issuers
en @endpoints.api
para proporcionar la información sobre los emisores externos. Por ejemplo:
@endpoints.api(
audiences={'auth0': ['aud-1.auth0.com', 'aud-2.auth0.com']},
issuers={'auth0': endpoints.Issuer('https://test.auth0.com',
'https://test.auth0.com/.well-known/jwks.json')})
class GreetingApi(remote.Service):
Definir un método de API (@endpoints.method
)
Puede definir los ajustes audiences
, scopes
y allowed_client_ids
de toda la API mediante @endpoints.api
o de un método mediante @endpoints.method
. Si estos ajustes se especifican tanto en la API como en el nivel de método, prevalece el ajuste del método.
Para crear un método en tu API, decora el método de Python correspondiente con @endpoints.method
y proporciona argumentos para configurar el uso del método. Por ejemplo, puedes especificar qué clases de solicitud y respuesta Message
quieres usar.
Los argumentos disponibles se indican en la siguiente tabla:
@endpoints.method Argumentos |
Descripción | Ejemplo |
---|---|---|
allowed_client_ids |
Este ajuste anula el atributo equivalente especificado en @endpoints.api . Para obtener más información, consulta IDs de cliente y audiencias permitidos. |
['1-web-apps.apps.googleusercontent.com', '2-android-apps.apps.googleusercontent.com'] |
api_key_required |
Opcional. Se usa para restringir el acceso a las solicitudes que proporcionan una clave de API. | api_key_required=True |
audiences |
Anula el argumento equivalente especificado en @endpoints.api . Para obtener más información, consulta IDs de cliente y audiencias permitidos. |
['1-web-apps.apps.googleusercontent.com'] |
metric_costs |
Opcional. Indica que el método tiene un límite de cuota. Se trata de un diccionario con los siguientes pares clave-valor:
|
metric_costs={'read-requests': 1} |
http_method |
Método HTTP que se va a usar. Si no lo haces, se usará 'POST' de forma predeterminada. |
'GET' |
name |
Nombre alternativo de este método. El valor de name :
|
'yourApi' |
path |
Ruta de URI para acceder a este método. Si no lo defines, se usará el nombre del método de Python. Si tienes previsto añadir gestión de APIs, no incluyas una barra al final en la ruta. | 'yourapi/path' |
Clase Request Message |
La clase Google Protocol RPC Request Message que se va a usar en la llamada al método. También puedes indicar el nombre de la clase. |
YourRequestClass |
Clase Response Message |
La clase Google Protocol RPC Response Message que se va a usar en la llamada al método. También puedes indicar el nombre de la clase. |
YourResponseClass |
Usar ResourceContainer
para argumentos de ruta o de cadena de consulta
Si la solicitud contiene argumentos de ruta o de cadena de consulta, no puedes usar una clase Message
simple, tal como se describe en Crear la API.
En su lugar, debes usar una clase ResourceContainer
, como se indica a continuación:
Define una clase
Message
que tenga todos los argumentos que se transfieren en el cuerpo de la solicitud. Si no hay argumentos en el cuerpo de la solicitud, no es necesario definir una claseMessage
, sino que basta con usarmessage_types.VoidMessage
. Por ejemplo:Define un
ResourceContainer
con la claseMessage
que has definido en el paso anterior como primer parámetro. Especifique los argumentos de la ruta y la cadena de consulta en los parámetros posteriores. Por ejemplo:donde el primer argumento es la clase
Message
de los datos del cuerpo de la solicitud ytimes
es un número que se espera en la ruta o en la cadena de consulta que acompaña a la solicitud.Proporciona
ResourceContainer
al método que gestiona la solicitud en el primer parámetro, que sustituye a la claseMessage
de la solicitud que, de lo contrario, se proporcionaría en esa ubicación. En este fragmento se muestran tantoResourceContainer
comoendpoints.method
:Añade el parámetro
path
como se muestra para incluir tu API.Si tu
ResourceContainer
tiene un argumento obligatorio, una solicitud de cliente debe incluirlo en una cadena de consulta (por ejemplo,yourApi?times=2
) o en la ruta de la URL (por ejemplo,yourApi/2
). Sin embargo, para que tu API reciba un valor de argumento mediante la ruta de la URL, también debes añadir el nombre del argumento a la ruta de la API, como se muestra en el argumento{times}
depath='yourApi/{times}
.