Los disparadores HTTP le permiten invocar una función de Function Compute mediante solicitudes HTTP o HTTPS estándar. Representan la vía más rápida para construir servicios web y API en Function Compute: no generan sobrecarga de codificación, no requieren gestionar una puerta de enlace adicional y son compatibles con cualquier herramienta de pruebas HTTP o servicio que admita webhooks.
Funcionamiento
Un disparador HTTP expone su función como un endpoint HTTP. Cuando llega una solicitud, Function Compute la autentica (si se configuró), la pasa a su función y devuelve la respuesta HTTP al llamador.
Métodos HTTP compatibles: GET, POST, PUT, DELETE, HEAD, PATCH y OPTIONS.
Ejemplo de un controlador mínimo para una función web en Node.js:
exports.handler = (event, context, callback) => {
const request = JSON.parse(event);
const response = {
statusCode: 200,
headers: { 'Content-Type': 'text/plain' },
body: 'Hello from Function Compute'
};
callback(null, response);
};
El objeto event contiene la solicitud HTTP completa (ruta, encabezados, cuerpo y método). Para enviar una respuesta HTTP, devuelva un objeto con statusCode, headers y body.
Notas de uso
Antes de desarrollar con disparadores HTTP, tenga en cuenta los siguientes comportamientos.
Riesgo de acceso anónimo
Si establece Authentication Method en No Authentication, cualquier persona que conozca la URL del endpoint podrá invocar su función. Para aplicar una autorización personalizada, valide el encabezado Authorization dentro del código de su función. Para obtener más detalles, consulte Configure signature-based authentication for HTTP triggers.
Restricción para descargar archivos APK
A partir del 10 de junio de 2024, los nuevos disparadores HTTP bloquean las descargas de archivos APK (tipo MIME application/vnd.android.package-archive) a través de endpoints de red pública. Estas solicitudes devuelven el código de estado HTTP 400. Para obtener más detalles, consulte How to ensure your HTTP trigger's public endpoint returns .apk files correctly.
Rotación de VIP
Function Compute rota periódicamente las direcciones IP virtuales (VIP) asociadas a los endpoints públicos y privados. Codificar las VIP de forma fija provoca interrupciones del servicio y no está cubierto por el acuerdo de nivel de servicio (SLA) de Function Compute. Utilice un nombre de dominio personalizado con configuración CNAME para garantizar un acceso estable. Para obtener más detalles, consulte Configure a custom domain name.
Comportamiento del dominio predeterminado y del adjunto
Cuando utiliza el dominio predeterminado aliyuncs.com, Function Compute añade content-disposition: attachment a todas las respuestas. Esto obliga a los navegadores a descargar las respuestas como archivos en lugar de mostrarlas. Configure un nombre de dominio personalizado para eliminar este comportamiento.
Límites
Límites de los disparadores
Se permite un máximo de un disparador HTTP por versión o alias de función. Consulte Version management y Alias management.
Los nombres de dominio integrados sirven únicamente para pruebas; su estabilidad no está garantizada. No los utilice en servicios de producción. Si va a exponer su función al público, vincule primero un nombre de dominio personalizado con registro ICP. Consulte Configure a custom domain name.
Límites de las solicitudes
|
Límite |
Valor |
|
Tamaño del encabezado (todas las claves y valores) |
8 KB |
|
Tamaño de la ruta (incluidos los parámetros de consulta) |
4 KB |
|
Tamaño del cuerpo: invocación síncrona |
32 MB |
|
Tamaño del cuerpo: invocación asíncrona |
Consulte Function execution resource limits |
Si supera los límites de encabezado, ruta o cuerpo en las invocaciones síncronas, se devuelve el código de estado HTTP 400 con el código de error InvalidArgument.
Encabezados de solicitud no compatibles: cualquier encabezado que comience con x-fc-, además de connection y keep-alive.
Límites de las respuestas
|
Límite |
Valor |
|
Tamaño del encabezado (todas las claves y valores) |
8 KB |
Si supera el límite del encabezado de respuesta, se devuelve el código de estado HTTP 502 con el código de error BadResponse.
Encabezados de respuesta no compatibles: cualquier encabezado que comience con x-fc-, además de connection, content-length, date, keep-alive, server, upgrade y content-disposition:attachment.
Métodos de invocación
Invocación síncrona
De manera predeterminada, los disparadores HTTP utilizan la invocación síncrona. La función procesa la solicitud y devuelve el resultado antes de que se cierre la conexión. Consulte Synchronous invocation.
Invocación asíncrona
En la invocación asíncrona, Function Compute almacena la solicitud y devuelve de inmediato el código de estado HTTP 202, sin esperar a que la función termine. Cualquier código de estado distinto de 202 indica que la invocación terminó con errores. Consulte Retry mechanism para conocer el manejo de fallos.
Existen dos formas de invocar de manera asíncrona:
Asincronía a nivel de solicitud: añada el encabezado
"X-Fc-Invocation-Type": "Async"a cualquier solicitud HTTP. Consulte Asynchronous invocation.Tarea asíncrona: tras configurar una tarea asíncrona para su función, añada el encabezado
"X-Fc-Async-Task-Id": "<task-id>"para especificar el identificador de la invocación. Consulte Asynchronous task.
La respuesta incluye el identificador de la solicitud en el encabezado; por ejemplo: "X-Fc-Request-Id": "80bf7****281713e1". Para consultar todos los encabezados de solicitud compatibles, vea Invoke a function.
Autenticación y autorización
Los llamadores externos deben superar las comprobaciones de autenticación de Function Compute antes de acceder a su función mediante un disparador HTTP. Métodos compatibles:
Intercambio de recursos de origen cruzado (CORS)
Function Compute admite tres formas de gestionar las solicitudes de intercambio de recursos de origen cruzado (CORS), cada una con distintas ventajas en cuanto a costo, complejidad y flexibilidad.
|
Función |
CORS configurado por API (recomendado) |
CORS predeterminado |
CORS definido por el usuario (código) |
|
¿Se factura la solicitud preflight? |
No se factura (la gestiona la puerta de enlace) |
Posibles cargos |
Se factura (se activa la función) |
|
Cambios de código necesarios |
Ninguna |
Ninguna |
Altos |
|
Versiones de API compatibles |
Solo FC 3.0 |
Todas las versiones |
Todas las versiones |
|
Complejidad de configuración |
Baja (configuración única) |
Ninguna |
Alta (debe manejar OPTIONS) |
Comportamiento predeterminado de CORS
De manera predeterminada, Function Compute replica los encabezados CORS según la solicitud recibida. En las solicitudes simples (sin preflight), la respuesta incluye lo siguiente:
Access-Control-Allow-Origin: copiado del encabezadoOriginde la solicitud.Access-Control-Allow-Credentials:true.Access-Control-Expose-Headers: encabezados definidos por Function Compute.
Gestión de CORS en el código de la función
Para las solicitudes simples, establezca los encabezados Access-Control-Allow-* directamente en su respuesta.
En las solicitudes no simples, el navegador envía una solicitud preflight OPTIONS antes de la solicitud real. Agregue OPTIONS a los métodos permitidos de su disparador HTTP y gestione esta petición en el código de su función.
<details> <summary>Ejemplo en Node.js</summary>
exports.handler = (event, context, callback) => {
const method = JSON.parse(event).requestContext.http.method;
if (method === 'OPTIONS') {
const fcResponse = {
statusCode: 204,
headers: {
'Access-Control-Allow-Origin': 'http://www.fc.com',
'Access-Control-Allow-Methods': 'POST',
'Access-Control-Allow-Headers': 'Content-Type, Authorization',
'Access-Control-Max-Age': '3600'
},
body: ''
};
callback(null, fcResponse);
} else {
callback(null, {
statusCode: 200,
body: 'hello world'
});
}
};
</details>
<details> <summary>Ejemplo en Python</summary>
import json
def handler(event, context):
evt = json.loads(event)
method = evt.get('requestContext', {}).get('http', {}).get('method', '')
if method == 'OPTIONS':
return {
'statusCode': 204,
'headers': {
'Access-Control-Allow-Origin': 'http://www.fc.com',
'Access-Control-Allow-Methods': 'POST',
'Access-Control-Allow-Headers': 'Content-Type, Authorization',
'Access-Control-Max-Age': '3600'
},
'body': ''
}
return {
'statusCode': 200,
'body': 'hello world'
}
</details>
<details> <summary>Ejemplo en Go</summary>
package main
import (
"context"
"encoding/json"
)
type HttpRequest struct {
RequestContext struct {
Http struct {
Method string `json:"method"`
} `json:"http"`
} `json:"requestContext"`
}
type HttpResponse struct {
StatusCode int `json:"statusCode"`
Headers map[string]string `json:"headers"`
Body string `json:"body"`
}
func Handler(ctx context.Context, event []byte) (*HttpResponse, error) {
var req HttpRequest
if err := json.Unmarshal(event, &req); err != nil {
return nil, err
}
if req.RequestContext.Http.Method == "OPTIONS" {
return &HttpResponse{
StatusCode: 204,
Headers: map[string]string{
"Access-Control-Allow-Origin": "http://www.fc.com",
"Access-Control-Allow-Methods": "POST",
"Access-Control-Allow-Headers": "Content-Type, Authorization",
"Access-Control-Max-Age": "3600",
},
Body: "",
}, nil
}
return &HttpResponse{StatusCode: 200, Body: "hello world"}, nil
}
</details>
CORS configurado por API
El CORS configurado por API está disponible como vista previa por invitación. Para habilitarlo, contact us y proporcione el identificador de su cuenta de Alibaba Cloud (UID).
El CORS configurado por API es una función de la capa de puerta de enlace. Configure las directivas CORS directamente en un disparador HTTP o en un nombre de dominio personalizado, sin necesidad de incluir lógica CORS en el código de su función.
Beneficios principales:
Sin cambios en el código: desacopla el manejo de CORS de la lógica de negocio.
Menor costo: la puerta de enlace gestiona directamente las solicitudes preflight
OPTIONS, por lo que no se ejecuta ninguna instancia de la función.Gestión centralizada: aplique las directivas CORS a nivel de disparador o de dominio.
Menor latencia: la puerta de enlace devuelve las respuestas preflight sin invocar su función.
Alcance:
Solo funciones de FC 3.0 (versión de API
2023-03-30).Aplica a los disparadores HTTP (incluidos los dominios de prueba integrados) y a los nombres de dominio personalizados vinculados.
Configúrelo mediante la Update trigger o la API Update custom domain name.
Parámetros de configuración de CORS
|
Parámetro |
Tipo |
Descripción |
Predeterminado |
Restricción |
|
|
Array |
Orígenes con permiso para acceder a los recursos |
— |
Máximo 100 elementos, cada uno de ≤ 256 caracteres. Admite |
|
|
Array |
Métodos HTTP permitidos |
Métodos del disparador |
No incluya |
|
|
Array |
Encabezados de solicitud personalizados permitidos desde los navegadores |
— |
Máximo 50 elementos. Admite |
|
|
Array |
Encabezados de respuesta expuestos a los navegadores |
Valor predeterminado del sistema |
Máximo 50 elementos. |
|
|
Boolean |
Indica si se permiten cookies y credenciales en las solicitudes de origen cruzado |
|
Si es |
|
|
Integer |
Duración de la caché para las respuestas preflight, en segundos |
|
Rango: 0–86400. |
Valores para allowOrigins:
*: permite todos los orígenes (solo cuandoallowCredentialsesfalse).https://*: permite todos los orígenes que comienzan conhttps://.Dominio específico:
https://example.com.Varios dominios:
["https://example.com", "https://app.example.com"].No se admiten comodines de subdominio (por ejemplo,
https://*.example.com). Enumere todos los dominios de forma explícita.
Valores para allowMethods:
Métodos HTTP estándar:
GET,POST,PUT,DELETE,PATCHyHEAD.*: permite todos los métodos.No incluya
OPTIONS, ya que la puerta de enlace gestiona automáticamente todas las solicitudes preflight.
Procesamiento de solicitudes en la puerta de enlace
Solicitudes preflight (OPTIONS)
La puerta de enlace valida los encabezados Origin, Access-Control-Request-Method y Access-Control-Request-Headers:
Validación exitosa: devuelve
204 No Contentcon los encabezados CORS configurados. No invoca la función.-
Validación fallida:
El origen coincide, pero otros encabezados no: la puerta de enlace establece los encabezados CORS básicos y reenvía la solicitud a la función.
El origen no coincide: no se establecen encabezados CORS. La solicitud se reenvía a la función.
Solicitudes simples (GET, POST, HEAD, etc.)
La puerta de enlace solo valida el encabezado Origin:
Validación exitosa: inyecta
Access-Control-Allow-Originy otros encabezados CORS en la respuesta, y reenvía la solicitud a la función.Validación fallida: no inyecta encabezados CORS, pero reenvía la solicitud a la función.
Prioridad
Cuando varios métodos de gestión de CORS aplican a la misma ruta, la puerta de enlace los aplica en este orden:
CORS configurado por API (prioridad más alta): si está habilitado, la puerta de enlace aplica esta configuración primero.
CORS predeterminado: si el CORS configurado por API está deshabilitado, la puerta de enlace usa el comportamiento de réplica predeterminado integrado.
CORS definido por la función: los encabezados que devuelve su función se combinan con los resultados anteriores.
Disparador HTTP frente a disparador de API Gateway
Tanto los disparadores HTTP como los de API Gateway permiten crear aplicaciones web.
|
Disparador HTTP |
Disparador de API Gateway |
|
|
Ideal para |
Una ruta ligera y directa de HTTP a la función |
Escenarios donde necesita funciones de API Gateway, como la gestión de tráfico o la transformación de solicitudes |
|
Enrutamiento de rutas |
Asigne rutas URL a su función mediante la vinculación de un nombre de dominio personalizado |
Configure Function Compute como backend de la API |
|
Documentación |
Los disparadores HTTP ofrecen estas ventajas sobre los de API Gateway:
Son más rápidos de configurar y más fáciles de depurar, ya que no requieren configuración adicional de la puerta de enlace.
Eliminan la sobrecarga de codificación y decodificación JSON, pues transmiten las solicitudes y respuestas directamente.
Son compatibles con las herramientas estándar de pruebas HTTP.
Se integran fácilmente con servicios que admiten webhooks, como la recuperación de origen de CDN y Simple Message Queue (antes MNS).
Preguntas frecuentes
¿Por qué falla la llamada a mi API después de agregar OPTIONS a allowMethods?
No agregue OPTIONS a corsConfig.allowMethods. La puerta de enlace gestiona automáticamente todas las solicitudes preflight. Incluir OPTIONS de forma manual genera errores en el procesamiento de las solicitudes.
Después de configurar el CORS por API, las solicitudes OPTIONS devuelven 200 en lugar de 204. ¿Por qué?
Confirme que su cuenta tiene acceso a la vista previa por invitación. Si el plugin de la puerta de enlace no está completamente activado, esta recurre al comportamiento predeterminado de CORS, el cual devuelve 200 y reenvía la solicitud a su función.
**¿Puedo usar comodines de subdominio en allowOrigins, por ejemplo *.example.com?**
No. No se admiten comodines de subdominio. Enumere de forma explícita todos los dominios necesarios en el arreglo allowOrigins, o use https://* para coincidir de manera amplia con orígenes HTTPS.
El código de mi función también establece encabezados CORS. ¿Habrá conflictos?
No. Los encabezados generados por la puerta de enlace y los devueltos por la función se combinan. Si existen duplicados, los navegadores utilizan el primer valor válido. Las aplicaciones existentes seguirán funcionando durante la migración.