Pemicu HTTP mengekspos suatu fungsi sebagai titik akhir HTTP(S), yang disebut URL fungsi. Saat klien memanggil URL tersebut, Function Compute mengonversi permintaan HTTP menjadi objek event dan meneruskannya ke penanganan fungsi Anda. Setelah fungsi mengembalikan respons, Function Compute memetakan output tersebut kembali ke respons HTTP dan mengirimkannya ke klien.
Topik ini mencakup perilaku Pemicu HTTP pada runtime bawaan. Untuk runtime kustom, lihat Web functions.
Pada Function Compute 3.0, perilaku Pemicu HTTP pada runtime bawaan berbeda secara signifikan dibandingkan Function Compute 2.0. Untuk detailnya, lihat Cara kerja. Untuk runtime kustom dan runtime Custom Container, perilakunya tetap sama seperti pada Function Compute 2.0.
Cara kerja
Saat klien memanggil URL fungsi Anda:
-
Function Compute memetakan permintaan HTTP ke objek
event. -
Objek event diteruskan ke penanganan fungsi Anda.
-
Setelah fungsi Anda mengembalikan respons, Function Compute memetakan output tersebut ke respons HTTP dan mengirimkannya kembali ke klien.
Struktur permintaan
Format
Function Compute memetakan permintaan HTTP masuk ke objek event dengan struktur berikut:
{
"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"
}
}
Parameter
| Parameter | Deskripsi | Contoh |
|---|---|---|
version |
Versi format payload. Satu-satunya nilai yang didukung adalah v1. |
v1 |
rawPath |
Path permintaan yang telah diencode URL. Untuk URL permintaan seperti https://{url-id}.{region}.fcapp.run/example, nilainya adalah /example. Untuk path yang telah didecode, lihat requestContext.http.path. |
/example |
body |
Badan permintaan. Data biner diencode Base64. | Hello FC! |
isBase64Encoded |
Apakah badan permintaan diencode Base64. Nilai yang valid: true, false. |
false |
headers |
Header permintaan dalam bentuk pasangan kunci-nilai. Jika suatu kunci memiliki beberapa nilai, nilai-nilai tersebut dipisahkan dengan koma. Di Function Compute 3.0, huruf pertama setiap kunci header diubah menjadi huruf kapital (normalisasi). Lihat Mengapa huruf pertama kunci header menjadi kapital saat saya menggunakan Pemicu HTTP untuk memanggil fungsi? | {"Header1": "value1", "Header2": "value1,value2"} |
queryParameters |
Parameter kueri dalam bentuk objek JSON. Untuk URL seperti https://{url-id}.{region}.fcapp.run/example?key1=value1, nilainya adalah {"key1": "value1"}. Beberapa nilai untuk kunci yang sama dipisahkan dengan koma. |
{"parameter1": "value1", "parameter2": "value1,value2"} |
requestContext |
Metadata permintaan tambahan, termasuk ID permintaan, timestamp, dan informasi pemanggil. | — |
requestContext.accountId |
ID Akun Alibaba Cloud yang memiliki fungsi tersebut. | 123456********* |
requestContext.domainName |
Nama domain dari Pemicu HTTP. | <http-trigger-id>.<region-id>.fcapp.run |
requestContext.domainPrefix |
Awalan domain dari Pemicu HTTP. | <http-trigger-id> |
requestContext.http |
Informasi detail tentang permintaan HTTP. | — |
requestContext.http.method |
Metode HTTP. Nilai yang valid: GET, POST, PUT, HEAD, OPTIONS, PATCH, DELETE. |
GET |
requestContext.http.path |
Path permintaan yang telah didecode. Untuk URL permintaan seperti https://{url-id}.{region}.fcapp.run/example?name=Jane, nilainya adalah /example. |
/example |
requestContext.http.protocol |
Protokol permintaan. | HTTP/1.1 |
requestContext.http.sourceIp |
IP peer dari koneksi TCP langsung (RemoteAddr). Lihat catatan di bawah. | 11.11.XX.XX |
requestContext.http.userAgent |
Nilai header permintaan user-agent. |
PostmanRuntime/7.32.3 |
requestContext.requestId |
ID permintaan untuk melacak log pemanggilan. | 1-64f6cd87-************* |
requestContext.time |
Timestamp permintaan dalam format ISO 8601. | 2023-09-05T06:41:11Z |
requestContext.timeEpoch |
Timestamp permintaan dalam waktu UNIX (milidetik). | 1693896071895 |
sourceIp adalah IP peer dari koneksi TCP langsung, yang belum tentu merupakan IP klien asli. Jika permintaan tidak diteruskan oleh proxy, sourceIp adalah IP klien. Jika permintaan melewati satu atau lebih proxy, sourceIp adalah IP proxy terakhir. Untuk mendapatkan IP klien asli saat permintaan melewati proxy, baca header X-Forwarded-For. Untuk detailnya, lihat Bagaimana cara mendapatkan alamat IP asli klien saat Pemicu HTTP memanggil fungsi yang menggunakan runtime bawaan?
Logika pemetaan
Function Compute memetakan permintaan HTTP ke objek event sebagai berikut:
-
Header permintaan HTTP →
event.headers -
Parameter kueri HTTP →
event.queryParameters -
Konteks permintaan (ID permintaan, timestamp, identitas pemanggil) →
event.requestContext -
Badan permintaan POST →
event.body
Pengkodean Base64
Function Compute memeriksa header Content-Type untuk menentukan apakah badan permintaan perlu diencode Base64.
Content-Type |
isBase64Encoded |
Penanganan badan |
|---|---|---|
text/* |
false |
Diteruskan apa adanya |
application/json |
false |
Diteruskan apa adanya |
application/ld+json |
false |
Diteruskan apa adanya |
application/xhtml+xml |
false |
Diteruskan apa adanya |
application/xml |
false |
Diteruskan apa adanya |
application/atom+xml |
false |
Diteruskan apa adanya |
application/javascript |
false |
Diteruskan apa adanya |
| Nilai lainnya | true |
Diencode Base64 sebelum diteruskan ke fungsi |
Contoh pemetaan permintaan
GET
| Permintaan HTTP | Objek event |
|---|---|
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"}}} |
Untuk mengirim permintaan ini dari CLI (ganti https://example.cn-hangzhou.fcapp.run dengan URL fungsi Anda):
curl -v "https://example.cn-hangzhou.fcapp.run?parameter1=value1¶meter2=value2"
POST
| Permintaan HTTP | Objek event |
|---|---|
|
{"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"}}} |
Untuk mengirim permintaan ini dari CLI (ganti https://example.cn-hangzhou.fcapp.run dengan URL fungsi Anda):
curl -v -H "Content-Type: application/json" -d '{"message": "Hello"}' "https://example.cn-hangzhou.fcapp.run"
Untuk memaksa pengkodean Base64 pada badan permintaan, aturContent-Typemenjadiapplication/x-www-form-urlencoded.
Struktur respons
Format
Output fungsi Anda diurai menjadi struktur respons sebelum dipetakan ke respons HTTP:
{
"statusCode": 200,
"headers": {
"Content-Type": "application/json",
"Custom-Header-1": "Custom Value"
},
"isBase64Encoded": false,
"body": "{\"message\":\"Hello FC!\"}"
}
Logika pemetaan
Function Compute memetakan output fungsi Anda ke respons HTTP berdasarkan apakah output tersebut merupakan JSON valid yang berisi bidang statusCode.
Jika output berupa JSON valid dengan statusCode:
| Bidang Struktur Respons | Respons HTTP |
|---|---|
statusCode |
Kode status |
headers["Content-Type"] |
Content-Type (default ke application/json jika tidak ada) |
body |
Badan respons |
isBase64Encoded |
Apakah badan perlu didecode Base64 sebelum dikirim (default ke false jika tidak ada) |
Jika output berupa JSON valid tanpa statusCode, atau bukan JSON:
Function Compute menggunakan nilai default berikut:
| Bidang | Nilai default |
|---|---|
statusCode |
200 |
Content-Type |
application/json |
body |
Output fungsi apa adanya |
isBase64Encoded |
false |
Contoh pemetaan respons
Contoh berikut menunjukkan bagaimana output fungsi mengalir melalui proses penguraian hingga menjadi respons HTTP akhir.
Output untuk respons string
| Output fungsi | Struktur respons terurai | Respons HTTP (diterima client) |
|---|---|---|
Hello World! |
{"statusCode":200,"body":"Hello World!","headers":{"content-type":"application/json"},"isBase64Encoded":false} |
|
Output untuk respons JSON
| Output fungsi | Struktur respons terurai | Respons HTTP (diterima client) |
|---|---|---|
{"message": "Hello World!"} |
{"statusCode":200,"body":"{\"message\": \"Hello World!\"}","headers":{"content-type":"application/json"},"isBase64Encoded":false} |
|
Output untuk respons kustom
| Output fungsi | Struktur respons terurai | Respons HTTP (diterima 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} |
|
Pendekodean Base64
Jika fungsi Anda mengembalikan JSON valid dengan isBase64Encoded diatur ke true, Function Compute akan mendekode Base64 body sebelum memetakannya ke badan respons HTTP. Jika pendekodean gagal, Function Compute mengembalikan nilai body secara langsung tanpa melaporkan error.
Header respons
Function Compute secara otomatis menambahkan header X-Fc-Request-Id ke setiap respons. Header ini secara unik mengidentifikasi permintaan dan berguna untuk melacak log serta mendiagnosis error. Selain X-Fc-Request-Id, Function Compute tidak menambahkan header respons lain secara default.
Header kustom dengan awalan X-Fc- tidak didukung. Header berikut dicadangkan oleh Function Compute dan diabaikan jika dikembalikan oleh fungsi Anda:
-
connection -
content-length -
date -
keep-alive -
server -
content-disposition
Penanganan error
Pemanggilan melalui Pemicu HTTP dan pemanggilan API langsung menangani error fungsi secara berbeda.
| Jenis pemanggilan | Perilaku Kesalahan | Kode status HTTP |
|---|---|---|
| Pemanggilan API langsung | Pesan error dikembalikan dalam badan respons | 200 |
| Pemicu HTTP (URL fungsi) | Pesan error disembunyikan; Internal Server Error dikembalikan |
502 |
Sebagai contoh, pemanggilan API langsung yang mengalami Python ModuleNotFoundError mengembalikan detail error berikut:
{
"errorMessage": "Unable to import module 'index'",
"errorType": "ImportModuleError",
"stackTrace": [
"ModuleNotFoundError: No module named 'not_exist_module'"
]
}
Saat fungsi yang dipanggil melalui Pemicu HTTP mengalami error, klien menerima respons seperti:
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
Gunakan nilai X-Fc-Request-Id untuk mencari detail error lengkap di log pemanggilan fungsi Anda.
Topik terkait
Jika Anda menulis kode fungsi untuk runtime bawaan, lihat dokumentasi penanganan untuk bahasa Anda: