Pemicu HTTP menyediakan titik akhir HTTP(S) untuk sebuah fungsi, yang disebut URL fungsi. Ini memungkinkan Anda langsung memanggil fungsi melalui permintaan HTTP. Topik ini menjelaskan cara menggunakan pemicu HTTP untuk memanggil fungsi dalam runtime bawaan Function Compute. Untuk informasi tentang penggunaan pemicu dalam runtime kustom, lihat Fungsi Web.
Pertimbangan
Dalam Function Compute 3.0, mekanisme pemicu HTTP yang memanggil fungsi di runtime kustom atau runtime Custom Container tetap sama seperti pada Function Compute 2.0. Namun, ada perbedaan signifikan dalam cara pemicu HTTP memanggil fungsi di runtime bawaan. Untuk informasi lebih lanjut, lihat bagian berikut.
Proses pemanggilan
Dalam runtime bawaan, ketika klien memanggil URL fungsi, Function Compute memetakan permintaan ke objek acara (event) dan meneruskan objek tersebut ke fungsi. Setelah eksekusi selesai, Function Compute memetakan hasilnya ke respons HTTP dan mengirimkannya kembali ke klien.
Struktur permintaan
Format struktur permintaan
Format struktur permintaan adalah sebagai berikut:
{
"version": "v1",
"rawPath": "/contoh",
"body": "Halo FC!",
"isBase64Encoded": false,
"headers": {
"header1": "nilai1",
"header2": "nilai1,nilai2"
},
"queryParameters": {
"parameter1": "nilai1",
"parameter2": "nilai1,nilai2"
},
"requestContext": {
"accountId": "123456*********",
"domainName": "<http-trigger-id>.<region-id>.fcapp.run",
"domainPrefix": "<http-trigger-id>",
"http": {
"method": "GET",
"path": "/contoh",
"protocol": "HTTP/1.1",
"sourceIp": "11.11.11.**",
"userAgent": "PostmanRuntime/7.32.3"
},
"requestId": "1-64f6cd87-*************",
"time": "2023-09-05T06:41:11Z",
"timeEpoch": "1693896071895"
}
}Tabel berikut menjelaskan parameter:
Parameter | Deskripsi | Contoh |
version | Versi format payload dari acara. Versi yang saat ini didukung adalah v1. | v1 |
rawPath | Path permintaan. Sebagai contoh, jika URL permintaan adalah | /contoh |
body | Body permintaan. Selama proses pemetaan, Function Compute melakukan Base64-encoding data biner. | Halo FC! |
isBase64Encoded | Menentukan apakah body permintaan dienkripsi Base64. Nilai valid: true dan false. | false |
headers | Daftar header permintaan, ditampilkan dalam pasangan key-value. Jika sebuah key memiliki beberapa nilai, nilai-nilai tersebut dipisahkan oleh koma (,). Proses pemetaan di mana Function Compute 3.0 mengubah permintaan HTTP menjadi objek acara menghasilkan huruf pertama setiap key header permintaan diubah menjadi huruf besar, sebuah perubahan yang dikenal sebagai proses normalisasi. Untuk informasi lebih lanjut, lihat Mengapa huruf pertama dari key header menjadi huruf besar ketika saya menggunakan pemicu HTTP untuk memanggil fungsi? | {"Header1": "nilai1", "Header2": "nilai1,nilai2"} |
queryParameters | Parameter query dari permintaan. Sebagai contoh, jika URL permintaan adalah | { "parameter1": "nilai1", "parameter2": "nilai1,nilai2" } |
requestContext | Objek yang berisi informasi tambahan tentang permintaan, seperti requestId, waktu permintaan dibuat, dan identitas pemanggil yang berwenang. | |
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 | Prefix domain dari pemicu HTTP. | <http-trigger-id> |
requestContext.http | Objek yang berisi informasi detail tentang permintaan HTTP. | |
requestContext.http.method | Metode HTTP yang digunakan dalam permintaan. Nilai valid: GET, POST, PUT, HEAD, OPTIONS, PATCH, dan DELETE. | GET |
requestContext.http.path | Path permintaan. Sebagai contoh, jika URL permintaan adalah | /contoh |
requestContext.http.protocol | Protokol dari permintaan. | HTTP/1.1 |
requestContext.http.sourceIp | Alamat IP sumber dari koneksi TCP langsung yang membuat permintaan. Alamat IP ini merujuk pada alamat IP peer (RemoteAddr) yang secara langsung menetapkan koneksi, khususnya alamat klien yang terhubung langsung ke server atau alamat proxy terakhir yang digunakan klien.
| 11.11.XX.XX |
requestContext.http.userAgent | Nilai dari header permintaan user-agent. | PostmanRuntime/7.32.3 |
requestContext.requestId | ID permintaan. Anda dapat menggunakan ID ini untuk melacak log pemanggilan yang terkait dengan fungsi. | 1-64f6cd87-************* |
requestContext.time | Timestamp dari permintaan. | 2023-09-05T06:41:11Z |
requestContext.timeEpoch | Timestamp dari permintaan, dalam waktu UNIX. | 1693896071895 |
Logika pemetaan permintaan
Function Compute memetakan permintaan HTTP masuk ke objek acara sebelum meneruskannya ke penanganan fungsi Anda. Logika pemetaan adalah sebagai berikut:
Header dari permintaan HTTP dipetakan ke
eventheaders.Parameter query dari permintaan HTTP dipetakan ke
queryParameters.Informasi kontekstual tentang permintaan HTTP dipetakan ke
requestContext.Body permintaan dari permintaan POST dipetakan ke
body.
Mekanisme pengkodean Base64
Ketika Function Compute memetakan permintaan HTTP ke objek acara (event), ia memeriksa nilai dari Content-Type dalam header permintaan untuk menentukan apakah pengkodean Base64 harus dilakukan.
Jika nilai dari
Content-Typemenunjukkan representasi tekstual, Function Compute tidak melakukan pengkodean Base64, dan parameterisBase64Encodeddalameventdiatur kefalse.Sebaliknya, body permintaan diubah menjadi format teks menggunakan pengkodean Base64, dan parameter
isBase64Encodeddiatur ketrue.
Nilai Content-Type berikut menunjukkan representasi tekstual:
text/*
application/json
application/ld+json
application/xhtml+xml
application/xml
application/atom+xml
application/javascript
Contoh pemetaan permintaan
GET
Permintaan HTTP | Objek acara |
| |
Anda dapat memasukkan perintah berikut di CLI untuk mengirim permintaan HTTP yang disebutkan di atas. Ganti https://contoh.cn-hangzhou.fcapp.run dengan URL sebenarnya dari fungsi Anda.
curl -v "https://contoh.cn-hangzhou.fcapp.run?parameter1=nilai1¶meter2=nilai2"POST
Permintaan HTTP | Objek acara |
| |
Anda dapat memasukkan perintah berikut di CLI untuk mengirim permintaan HTTP yang disebutkan di atas. Ganti
https://contoh.cn-hangzhou.fcapp.rundengan URL sebenarnya dari fungsi Anda.curl -v -H "Content-Type: application/json" -d '{"message": "Halo"}' "https://contoh.cn-hangzhou.fcapp.run"Jika Anda ingin mengkodekan permintaan Anda dalam format Base64, cukup atur
Content-Typedalam header permintaan keapplication/x-www-form-urlencoded.
Struktur respons
Format struktur respons
Format struktur respons adalah sebagai berikut. Function Compute mengurai output fungsi Anda, mentransformasikannya menjadi struktur respons, dan memetakan struktur ini ke respons HTTP.
{
"statusCode": 200,
"headers": {
"Content-Type": "application/json",
"Custom-Header-1": "Nilai Kustom"
},
"isBase64Encoded": false,
"body": "{\"message\":\"Halo FC!\"}"
}Logika pemetaan respons
Setelah menguraikan output fungsi, Function Compute memetakan struktur respons ke respons HTTP.
Jika fungsi Anda mengembalikan JSON yang valid dengan
statusCode, proses pemetaan diatur oleh aturan berikut:statusCodedalam JSON dipetakan kestatusCodedalam respons HTTP.Content-Typedalam JSON dipetakan keContent-Typedalam respons HTTP. Jika JSON tidak mengandung parameterContent-Type, nilai defaultapplication/jsondigunakan.bodydalam JSON, yang merupakan output fungsi, dipetakan kebodyrespons HTTP.Parameter
isBase64Encodeddalam JSON dipetakan ke parameterisBase64Encodeddalam respons HTTP. Jika JSON tidak mengandung parameterisBase64Encoded, nilai default "false" digunakan.
Jika fungsi Anda mengembalikan JSON yang valid tanpa
statusCode, atau jika mengembalikan data dalam format selain JSON, Function Compute membuat asumsi berikut untuk membangun respons HTTP:statusCodeadalah 200.Content-Typeadalahapplication/json.bodyadalah output fungsi.isBase64Encodedadalah false.
Kesimpulannya, Function Compute mengonversi data yang dikembalikan oleh fungsi Anda menjadi respons HTTP dan mengirimkannya kembali ke klien.
statusCodedipetakan ke kode status dari respons HTTP.headersdipetakan ke header respons HTTP.bodydipetakan ke body respons HTTP. Jika parameterisBase64Encodedada dan nilainya true, maka databodyakan didekodekan ke dalam bentuk biner sebelum dipetakan ke body respons HTTP.
Contoh pemetaan respons
Bagian ini menunjukkan bagaimana output fungsi Anda diuraikan menjadi struktur respons dan bagaimana struktur tersebut dipetakan ke respons HTTP pada klien. Ketika klien memanggil fungsi Anda melalui titik akhir HTTP(S)-nya, ia menerima respons HTTP.
Output untuk respons string
Output fungsi | Output fungsi yang diuraikan | Respons HTTP (ke klien) |
| | |
Output untuk respons JSON
Output fungsi | Output fungsi yang diuraikan | Respons HTTP (ke klien) |
| | |
Output untuk respons kustom
Output fungsi | Output fungsi yang diuraikan | Respons HTTP (ke klien) |
| | |
Mekanisme dekode Base64
Jika fungsi Anda mengembalikan JSON yang valid dengan parameter isBase64Encoded yang nilainya true, Function Compute melakukan dekode Base64 pada body JSON dan kemudian memetakan data yang didekodekan ke body respons HTTP.
Jika body JSON gagal didekode, Function Compute tidak melaporkan kesalahan. Sebagai gantinya, ia langsung mengembalikan nilai dari body JSON ke klien.
Header respons HTTP
Dalam pemanggilan URL fungsi, header respons X-Fc-Request-Id, yang secara otomatis ditambahkan oleh Function Compute, secara unik mengidentifikasi permintaan yang memicu pemanggilan fungsi. Function Compute tidak secara otomatis menambahkan header respons lainnya.
Anda dapat mengembalikan header kustom dari fungsi Anda. Perhatikan bahwa header kustom yang dimulai dengan X-Fc- tidak didukung. Selain itu, header respons berikut tidak dapat digunakan sebagai header kustom karena dicadangkan oleh Function Compute.
connection
content-length
date
keep-alive
server
content-disposition
Jika salah satu header cadangan ini digunakan sebagai header kustom, Function Compute akan mengabaikannya.
Penanganan kesalahan
Ketika fungsi yang dipanggil melalui API mengalami kesalahan, pesan kesalahan dikembalikan sebagai bagian dari respons, dan kode status HTTP 200 dikembalikan. Sebagai contoh, kode sampel berikut menunjukkan respons terhadap kesalahan ModuleNotFound dalam Python:
{
"errorMessage": "Tidak dapat mengimpor modul 'index'",
"errorType": "ImportModuleError",
"stackTrace": [
"ModuleNotFoundError: Tidak ada modul bernama 'not_exist_module'"
]
}Namun, dalam kasus pemanggilan URL fungsi, Function Compute menyembunyikan pesan kesalahan dan hanya mengembalikan Internal Server Error. Kode status HTTP adalah 502. Kode sampel berikut menunjukkan sebuah contoh:
HTTP/1.1 502 Bad Gateway
Content-Disposition: attachment
Content-Type: application/json
X-Fc-Request-Id: 1-64f6df91-fe144d52e4fd27afe3d8dd6f
Date: Tue, 05 Sep 2023 07:58:09 GMT
Content-Length: 21
Internal Server ErrorAnda dapat menggunakan header respons X-Fc-Request-Id untuk secara efisien menemukan log yang relevan dan mengidentifikasi pesan kesalahan yang terkait dengan permintaan.
Referensi
Jika Anda menulis kode dalam runtime bawaan Function Compute 3.0, Anda mungkin menemukan topik berikut tentang penanganan berguna.