Un déclencheur HTTP expose une fonction sous la forme d'un endpoint HTTP(S), appelé URL de fonction. Lorsqu'un client appelle l'URL de fonction, Function Compute convertit la requête HTTP en objet événement et le transmet au gestionnaire de votre fonction. Une fois la fonction exécutée, Function Compute mappe la sortie vers une réponse HTTP et l'envoie au client.
Cette rubrique décrit le comportement du déclencheur HTTP dans les environnements d'exécution intégrés. Pour les environnements d'exécution personnalisés, consultez Fonctions web.
Dans Function Compute 3.0, le comportement du déclencheur HTTP dans les environnements d'exécution intégrés diffère sensiblement de celui de Function Compute 2.0. Pour plus de détails, voir Fonctionnement . Pour les environnements d'exécution personnalisés et les environnements Custom Container, le comportement reste identique à celui de Function Compute 2.0.
Fonctionnement
Lorsqu'un client appelle l'URL de votre fonction :
Function Compute mappe la requête HTTP vers un objet événement (
event).L'objet événement est transmis au gestionnaire de votre fonction.
Une fois votre fonction terminée, Function Compute mappe la sortie vers une réponse HTTP et la renvoie au client.
Structure de la requête
Format
Function Compute mappe la requête HTTP entrante vers un objet événement présentant la structure suivante :
{
"version": "v1",
"rawPath": "/example",
"body": "Hello FC!",
"isBase64Encoded": false,
"headers": {
"header1": "value1",
"header2": "value1,value2"
},
"queryParameters": {
"parameter1": "value1",
"parameter2": "value1,value2"
},
"requestContext": {
"accountId": "123456*********",
"domainName": "<http-trigger-id>.<region-id>.fcapp.run",
"domainPrefix": "<http-trigger-id>",
"http": {
"method": "GET",
"path": "/example",
"protocol": "HTTP/1.1",
"sourceIp": "11.11.11.**",
"userAgent": "PostmanRuntime/7.32.3"
},
"requestId": "1-64f6cd87-*************",
"time": "2023-09-05T06:41:11Z",
"timeEpoch": "1693896071895"
}
}
Paramètres
| Paramètre | Description | Exemple |
|---|---|---|
version |
Version du format de charge utile. La seule valeur prise en charge est v1. |
v1 |
rawPath |
Chemin de la requête encodé en URL. Pour une URL de requête telle que https://{url-id}.{region}.fcapp.run/example, cette valeur est /example. Pour le chemin décodé, voir requestContext.http.path. |
/example |
body |
Corps de la requête. Les données binaires sont encodées en Base64. | Hello FC! |
isBase64Encoded |
Indique si le corps de la requête est encodé en Base64. Valeurs valides : true, false. |
false |
headers |
En-têtes de requête sous forme de paires clé-valeur. Si une clé possède plusieurs valeurs, elles sont séparées par des virgules. Dans Function Compute 3.0, la première lettre de chaque clé d'en-tête est mise en majuscule (normalisation). Voir Pourquoi la première lettre de la clé d'en-tête devient-elle majuscule lors de l'utilisation d'un déclencheur HTTP pour invoquer une fonction ? | {"Header1": "value1", "Header2": "value1,value2"} |
queryParameters |
Paramètres de requête sous forme d'objet JSON. Pour une URL telle que https://{url-id}.{region}.fcapp.run/example?key1=value1, cette valeur est {"key1": "value1"}. Plusieurs valeurs pour la même clé sont séparées par des virgules. |
{"parameter1": "value1", "parameter2": "value1,value2"} |
requestContext |
Métadonnées supplémentaires de la requête, incluant l'ID de requête, l'horodatage et les informations sur l'appelant. | — |
requestContext.accountId |
ID du compte Alibaba Cloud propriétaire de la fonction. | 123456********* |
requestContext.domainName |
Nom de domaine du déclencheur HTTP. | <http-trigger-id>.<region-id>.fcapp.run |
requestContext.domainPrefix |
Préfixe de domaine du déclencheur HTTP. | <http-trigger-id> |
requestContext.http |
Informations détaillées sur la requête HTTP. | — |
requestContext.http.method |
Méthode HTTP. Valeurs valides : GET, POST, PUT, HEAD, OPTIONS, PATCH, DELETE. |
GET |
requestContext.http.path |
Chemin de la requête décodé. Pour une URL de requête telle que https://{url-id}.{region}.fcapp.run/example?name=Jane, cette valeur est /example. |
/example |
requestContext.http.protocol |
Protocole de la requête. | HTTP/1.1 |
requestContext.http.sourceIp |
Adresse IP homologue de la connexion TCP directe (RemoteAddr). Voir la note ci-dessous. | 11.11.XX.XX |
requestContext.http.userAgent |
Valeur de l'en-tête de requête user-agent. |
PostmanRuntime/7.32.3 |
requestContext.requestId |
ID de requête permettant de tracer les journaux d'invocation. | 1-64f6cd87-************* |
requestContext.time |
Horodatage de la requête au format ISO 8601. | 2023-09-05T06:41:11Z |
requestContext.timeEpoch |
Horodatage de la requête en temps UNIX (millisecondes). | 1693896071895 |
sourceIp correspond à l'adresse IP homologue de la connexion TCP directe, et non nécessairement à l'IP originale du client. Si la requête n'est pas transférée par un proxy, sourceIp est l'IP du client. Si la requête traverse un ou plusieurs proxys, sourceIp est l'IP du dernier proxy. Pour obtenir l'IP originale du client lorsque les requêtes transitent par des proxys, lisez l'en-tête X-Forwarded-For. Pour plus de détails, voir Comment obtenir l'adresse IP originale d'un client lorsqu'un déclencheur HTTP invoque une fonction utilisant un environnement d'exécution intégré ?
Logique de mappage
Function Compute mappe la requête HTTP vers l'objet événement comme suit :
En-têtes de requête HTTP →
event.headersParamètres de requête HTTP →
event.queryParametersContexte de la requête (ID de requête, horodatage, identité de l'appelant) →
event.requestContextCorps de la requête POST →
event.body
Encodage Base64
Function Compute vérifie l'en-tête Content-Type pour décider s'il faut encoder le corps de la requête en Base64.
**Content-Type** |
**isBase64Encoded** |
Traitement du corps |
|---|---|---|
text/* |
false |
Transmis tel quel |
application/json |
false |
Transmis tel quel |
application/ld+json |
false |
Transmis tel quel |
application/xhtml+xml |
false |
Transmis tel quel |
application/xml |
false |
Transmis tel quel |
application/atom+xml |
false |
Transmis tel quel |
application/javascript |
false |
Transmis tel quel |
| Toute autre valeur | true |
Encodé en Base64 avant transmission à la fonction |
Exemples de mappage de requête
GET
| Requête HTTP | Objet événement |
|---|---|
GET /?parameter1=value1¶meter2=value2 HTTP/1.1 |
{"version":"v1","rawPath":"/","headers":{"Accept":"*/*","User-Agent":"CurlHttpClient"},"queryParameters":{"parameter1":"value1","parameter2":"value2"},"body":"","isBase64Encoded":true,"requestContext":{"accountId":"1327**********","domainName":"example.cn-hangzhou.fcapp.run","domainPrefix":"example","requestId":"1-67aee50c-****-**********","time":"2025-02-14T06:39:08Z","timeEpoch":"1739515148145","http":{"method":"GET","path":"/","protocol":"HTTP/1.1","sourceIp":"40.XX.XX.XX","userAgent":"CurlHttpClient"}}} |
Pour envoyer cette requête depuis la CLI (remplacez https://example.cn-hangzhou.fcapp.run par l'URL de votre fonction) :
curl -v "https://example.cn-hangzhou.fcapp.run?parameter1=value1¶meter2=value2"
POST
| Requête HTTP | Objet événement |
|---|---|
|
{"version":"v1","rawPath":"/","headers":{"Accept":"*/*","Content-Length":"20","Content-Type":"application/json","User-Agent":"curl/8.7.1"},"queryParameters":{},"body":"{\"message\": \"Hello\"}","isBase64Encoded":false,"requestContext":{"accountId":"1327**********","domainName":"example.cn-hangzhou.fcapp.run","domainPrefix":"example","requestId":"1-67aee50c-****-**********","time":"2025-02-14T06:39:08Z","timeEpoch":"1739515148145","http":{"method":"POST","path":"/","protocol":"HTTP/1.1","sourceIp":"40.XX.XX.XX","userAgent":"CurlHttpClient"}}} |
Pour envoyer cette requête depuis la CLI (remplacez https://example.cn-hangzhou.fcapp.run par l'URL de votre fonction) :
curl -v -H "Content-Type: application/json" -d '{"message": "Hello"}' "https://example.cn-hangzhou.fcapp.run"
Pour forcer l'encodage Base64 du corps de la requête, définissezContent-Typesurapplication/x-www-form-urlencoded.
Structure de la réponse
Format
La sortie de votre fonction est analysée dans une structure de réponse avant d'être mappée vers la réponse HTTP :
{
"statusCode": 200,
"headers": {
"Content-Type": "application/json",
"Custom-Header-1": "Custom Value"
},
"isBase64Encoded": false,
"body": "{\"message\":\"Hello FC!\"}"
}
Logique de mappage
Function Compute mappe la sortie de votre fonction vers la réponse HTTP selon que la sortie est un JSON valide contenant un champ statusCode.
**Lorsque la sortie est un JSON valide avec statusCode :**
| Champ de la structure de réponse | Réponse HTTP |
|---|---|
statusCode |
Code d'état |
headers["Content-Type"] |
En-tête Content-Type (par défaut application/json si absent) |
body |
Corps de la réponse |
isBase64Encoded |
Indique s'il faut décoder le corps en Base64 avant l'envoi (par défaut false si absent) |
**Lorsque la sortie est un JSON valide sans statusCode, ou n'est pas du JSON :**
Function Compute utilise les valeurs par défaut suivantes :
| Champ | Valeur par défaut |
|---|---|
statusCode |
200 |
Content-Type |
application/json |
body |
Sortie de la fonction telle quelle |
isBase64Encoded |
false |
Exemples de mappage de réponse
Les exemples suivants illustrent le flux de la sortie de fonction, de l'analyse jusqu'à la réponse HTTP finale.
Sortie pour une réponse chaîne
| Sortie de la fonction | Structure de réponse analysée | Réponse HTTP (reçue par le client) |
|---|---|---|
Hello World! |
{"statusCode":200,"body":"Hello World!","headers":{"content-type":"application/json"},"isBase64Encoded":false} |
|
Sortie pour une réponse JSON
| Sortie de la fonction | Structure de réponse analysée | Réponse HTTP (reçue par le client) |
|---|---|---|
{"message": "Hello World!"} |
{"statusCode":200,"body":"{\"message\": \"Hello World!\"}","headers":{"content-type":"application/json"},"isBase64Encoded":false} |
|
Sortie pour une réponse personnalisée
| Sortie de la fonction | Structure de réponse analysée | Réponse HTTP (reçue par le client) |
|---|---|---|
{"statusCode":201,"headers":{"Content-Type":"application/json","My-Custom-Header":"Custom Value"},"body":{"message":"Hello, world!"},"isBase64Encoded":false} |
{"statusCode":201,"headers":{"Content-Type":"application/json","My-Custom-Header":"Custom Value"},"body":{"message":"Hello, world!"},"isBase64Encoded":false} |
|
Décodage Base64
Si votre fonction renvoie un JSON valide avec isBase64Encoded défini sur true, Function Compute décode le body en Base64 avant de le mapper vers le corps de la réponse HTTP. Si le décodage échoue, Function Compute renvoie la valeur de body directement sans signaler d'erreur.
En-têtes de réponse
Function Compute ajoute automatiquement l'en-tête X-Fc-Request-Id à chaque réponse. Cet en-tête identifie de manière unique la requête et s'avère utile pour tracer les journaux et diagnostiquer les erreurs. À l'exception de X-Fc-Request-Id, Function Compute n'ajoute aucun autre en-tête de réponse par défaut.
Les en-têtes personnalisés avec le préfixe X-Fc- ne sont pas pris en charge. Les en-têtes suivants sont réservés par Function Compute et sont ignorés s'ils sont renvoyés par votre fonction :
connectioncontent-lengthdatekeep-aliveservercontent-disposition
Gestion des erreurs
Les invocations via déclencheur HTTP et les invocations directes par API gèrent différemment les erreurs de fonction.
| Type d'invocation | Comportement en cas d'erreur | Code d'état HTTP |
|---|---|---|
| Invocation directe par API | Message d'erreur renvoyé dans le corps de la réponse | 200 |
| Déclencheur HTTP (URL de fonction) | Message d'erreur masqué ; Internal Server Error renvoyé |
502 |
Par exemple, une invocation directe par API rencontrant une erreur Python ModuleNotFoundError renvoie les détails d'erreur suivants :
{
"errorMessage": "Unable to import module 'index'",
"errorType": "ImportModuleError",
"stackTrace": [
"ModuleNotFoundError: No module named 'not_exist_module'"
]
}
Lorsqu'une fonction invoquée via un déclencheur HTTP rencontre une erreur, le client reçoit une réponse semblable à :
HTTP/1.1 502 Bad Gateway
Content-Disposition: attachment
Content-Type: application/json
X-Fc-Request-Id: 1-64f6df91-fe144d52e4fd27afe3d8dd6f
Content-Length: 21
Internal Server Error
Utilisez la valeur X-Fc-Request-Id pour rechercher les détails complets de l'erreur dans les journaux d'invocation de votre fonction.
Rubriques connexes
Si vous écrivez du code de fonction pour un environnement d'exécution intégré, consultez la documentation relative aux gestionnaires pour votre langage :