Usa funciones de HTTP cuando desees invocar tu función mediante solicitudes HTTP(s). Para permitir la semántica de HTTP, las firmas de las funciones de HTTP aceptan argumentos específicos de HTTP.
Ejemplo de uso
En el siguiente ejemplo, se muestra cómo procesar una solicitud HTTP POST que contiene un parámetro name
:
Node.js
Python
Go
Java
C#
Ruby
Con el siguiente comando, se muestra cómo llamar a la función y pasarle un parámetro mediante curl
:
curl -X POST HTTP_TRIGGER_ENDPOINT -H "Content-Type:application/json" -d '{"name":"Jane"}'
En el comando anterior, HTTP_TRIGGER_ENDPOINT
es la URL de la función, que se obtiene cuando esta se implementa. Para obtener más información, consulta Activadores de HTTP.
Marcos de trabajo de HTTP
Para controlar HTTP, Cloud Functions utiliza un marco de trabajo de HTTP particular en cada entorno de ejecución:
Entorno de ejecución | Framework de HTTP |
---|---|
Node.js (8, 10 y 12) | Express 4.17.1 |
Python | Flask 1.0.2 |
Go | Interfaz http.HandlerFunc estándar |
Java | API de Functions Framework para Java |
.NET | API de Functions Framework para .NET |
Ruby | Functions Framework para Ruby |
Analiza solicitudes HTTP
En el siguiente ejemplo, se muestra cómo leer las solicitudes HTTP en varios formatos:Node.js
En Node.js, el cuerpo de la solicitud se analiza de forma automática según el encabezado content-type
y se encuentra disponible mediante los argumentos de la función de HTTP.
Python
Go
Java
C#
Ruby
Administra solicitudes de CORS
El uso compartido de recursos multiorigen (CORS) es una forma de permitir que las aplicaciones que se ejecutan en un dominio accedan al contenido de otro dominio, por ejemplo, cuando yourdomain.com
realiza solicitudes a region-project.cloudfunctions.net/yourfunction
.
Si CORS no está configurado correctamente, es probable que recibas errores similares a los siguientes:
XMLHttpRequest cannot load https://region-project.cloudfunctions.net/function. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://yourdomain.com' is therefore not allowed access.
CORS consiste en dos solicitudes:
- Una solicitud de comprobación previa de
OPTIONS
- Una solicitud principal que sigue a la solicitud de
OPTIONS
La solicitud de comprobación previa contiene encabezados que indican qué método (Access-Control-Request-Method
) y qué encabezados adicionales (Access-Control-Request-Headers
) se enviarán en la solicitud principal, así como el origen de la solicitud principal (Origin
).
Para administrar una solicitud de comprobación previa, debes establecer los encabezados Access-Control-Allow-*
apropiados a fin de que coincidan con las solicitudes que deseas aceptar:
Node.js
Python
Go
Java
C#
Ruby
De manera alternativa, puedes usar una biblioteca de terceros para que administre CORS por ti.
Autenticación y CORS
Si planeas enviar una solicitud con un encabezado Authorization
, debes seguir estos pasos:
- Agregar el encabezado
Authorization
aAccess-Control-Allow-Headers
. - Configurar el encabezado
Access-Control-Allow-Credentials
comotrue
. - Establecer un origen específico en
Access-Control-Allow-Origin
(no se aceptan comodines).
Node.js
Python
Go
Java
Aloja en el mismo dominio
En lugar de implementar CORS, podrías alojar tu sitio web y tus funciones en el mismo dominio. Puesto que las solicitudes ahora provendrían del mismo origen, CORS no se aplicará. Esta acción simplifica tu código de manera considerable.
La manera más sencilla de hacerlo es integrar Firebase Hosting a Google Cloud Functions.
Cómo usar Cloud Endpoints para controlar CORS
Puedes implementar un proxy de Cloud Endpoints y habilitar CORS.
Si deseas contar con capacidades de autenticación, también puedes habilitar la validación del token de ID de Google, lo que validará estos mismos tokens de autenticación.
Cómo controlar métodos de HTTP
Las funciones de HTTP aceptan todos los métodos de HTTP. En el siguiente ejemplo, se muestra cómo realizar diferentes acciones según el método de HTTP recibido (por ejemplo, GET
y PUT
):
Node.js
Python
Go
Java
C#
Ruby
Administra tipos de contenido
Para Node.js, Cloud Functions analiza los tipos de contenido del cuerpo de la solicitud de application/json
y application/x-www-form-urlencoded
como se muestra arriba. Los tipos de contenido de texto sin formato (text/plain
) se pasan como strings con UTF-8 como codificación predeterminada (o una codificación personalizada proporcionada en el encabezado content-type
).
Se puede acceder a otros tipos de contenido mediante la inspección del argumento de tu función de HTTP. Los métodos para hacerlo varían según el lenguaje.
En el siguiente ejemplo, se maneja una solicitud con un tipo de contenido de text/xml
:
Node.js
La propiedadrawBody
contiene bytes sin analizar del cuerpo de la solicitud.
Python
Go
Datos multiparte
En el siguiente ejemplo, se muestra cómo procesar datos con un tipo de contenido multipart/form-data
. Según el lenguaje que hayas elegido, es posible que debas usar una biblioteca de análisis.
Node.js
Python
Go
Java
C#
Ruby
Sube archivos a través de Cloud Storage
Un caso práctico común de Cloud Functions es el procesamiento de archivos. Para archivos grandes o aquellos que requieren un almacenamiento continuo más allá del alcance de una sola solicitud, puedes usar Cloud Storage como un punto de entrada para tus cargas de archivos. Para lograrlo, debes generar una URL firmada que proporcione acceso de escritura temporal al bucket de Cloud Storage.
Si usas Cloud Functions directamente, genera una URL firmada con la biblioteca de cliente de Cloud Storage.El proceso para subir archivos a una función de Cloud Functions con Cloud Storage consta de tres pasos que se describen a continuación:
Los clientes llaman a una función de Cloud Functions directamente para recuperar la URL firmada.
Luego, los clientes envían los datos del archivo a la URL firmada a través de la solicitud HTTP PUT.
Se activa una segunda función de Cloud Functions mediante la mutación en el bucket de Storage para procesar aún más el archivo.
Puedes ver el siguiente ejemplo de uso de la biblioteca cliente de Cloud Storage para generar una URL firmada.
Cloud Functions tiene una “credencial de aplicación predeterminada” que, por lo general, no incluye el permiso iam.serviceAccounts.signBlob
. Para habilitar este permiso, primero será necesario que te asegures de que la cuenta de servicio de tu función tenga la función de IAM apropiada. Puedes hacer esto con Cloud Console o la herramienta de línea de comandos de gcloud
:
Console
Para asegurarte de que la cuenta de servicio de tu función tenga la función de IAM apropiada, puedes modificar directamente las funciones de IAM de una cuenta si sigues estos pasos:
- Ve a Google Cloud Console:
- Selecciona la cuenta correcta y elige Editor > Cuentas de servicio > Creador de token de cuenta de servicio.
gcloud
Para asegurarte de que la cuenta de servicio de la función tiene la función apropiada, ejecuta el siguiente comando. La función predefinida serviceAccountTokenCreator
tiene el permiso iam.serviceAccounts.signBlob
que necesitas:
gcloud projects add-iam-policy-binding YOUR_PROJECT \ --member serviceAccount:YOUR_SERVICE_ACCOUNT --role roles/iam.serviceAccountTokenCreator
Puedes determinar qué cuenta de servicio usan tus funciones mediante Cloud Console o la herramienta de línea de comandos de gcloud
:
Console
Sigue estos pasos para determinar la cuenta de servicio que usan tus funciones con Cloud Console:
Ve a Google Cloud Console:
En la lista, selecciona la función que quieres inspeccionar.
Puedes ver la cuenta de servicio en la página de detalles de la función.
gcloud
Para determinar la cuenta de servicio que usan tus funciones, ejecuta el siguiente comando y busca la propiedad serviceAccountEmail
:
gcloud beta functions describe YOUR_FUNCTION_NAME
A continuación, se muestra un ejemplo de cómo generar una URL firmada:
Node.js
Python
Go
Java
C#
Cuando el cliente sube un archivo a la URL firmada, puedes activar una segunda función desde esta mutación si quieres tomar medidas adicionales para la carga. Consulta el instructivo de Cloud Storage para obtener más información sobre cómo activar una función de Cloud Functions después de los cambios a un bucket de Cloud Storage.
Pasos siguientes
- Cómo implementar Cloud Functions.
- Cómo llamar a funciones de HTTP.
- Instructivo de funciones de HTTP de Cloud Functions