Fetch API adalah metode untuk mengambil data dari titik keberadaan (POPs). Anda dapat menggunakan Fetch API untuk meminta data dari POP melalui HTTP atau HTTPS dan mengembalikan data tersebut kepada pengguna. Fetch API ini mirip dengan Fetch API di lingkungan browser dan cocok untuk skenario seperti pemuatan konten dinamis, berinteraksi dengan layanan backend, serta menerapkan Pengujian A/B.
Definisi metode Fetch API
Fetch sepenuhnya asinkron dan tidak memblokir eksekusi skrip kecuali jika Anda menggunakan await. Anda dapat mengirim hingga empat subpermintaan sekaligus. Lapisan dasar menggunakan koneksi persisten, sehingga Anda tidak perlu mengelola kolam koneksi.
Fetch mendukung permintaan HTTP atau HTTPS. Setiap redirect dihitung sebagai satu permintaan, dan setiap permintaan fetch mendukung maksimal 12 operasi redirect.
Definisi metode
fetch(arg, init). Untuk informasi lebih lanjut, lihat dokumentasi MDN untuk WorkerOrGlobalScope.fetch().Batasan metode
Fetch API hanya mendukung nama domain, bukan alamat IP. Port default untuk permintaan HTTP adalah 80, dan port default untuk permintaan HTTPS adalah 443.
Properti
credentials,referrer,referrerPolicy,cache, danintegritydari parameterinittidak berpengaruh.Nilai default untuk
redirectadalahfollow, yang berarti fetch mengikuti respons 3xx dari server origin. Untuk mencegah fetch mengikuti respons 3xx, aturredirectkemanual.
CatatanBerbagai mode Fetch yang tersedia di browser tidak berlaku. Misalnya, pada CDN, DCDN, atau ESA, Anda dapat menggunakan
CROS fetchuntuk mengambil data dari server origin mana pun.Untuk mengirim empat atau lebih subpermintaan, kirim tiket untuk meminta peningkatan kuota.
Panjang total URL permintaan tidak boleh melebihi 4 KB.
Sumber daya yang dikompresi Gzip yang diambil fungsi menggunakan Fetch secara default didekompresi. Untuk mencegah dekompresi default, tambahkan parameter
manual. Untuk informasi lebih lanjut, lihat bagian Dekompresi.
Mengatur periode timeout
Fungsi timeout
/** * Implementasi kontrol timeout permintaan * * @param {Number} timeout Periode timeout, dalam ms * @param {Object} config Konfigurasi timeout * - @param {Object|Funtion} handler Nilai yang dikembalikan saat timeout * @returns */ const RequestTimeout = (timeout, config) => { return new Promise((resolve) => { const { handler = null } = config; let timer = setTimeout(() => { clearTimeout(timer); timer = null; const defaultRes = (typeof handler === 'function' ? handler() : handler) || {}; resolve(defaultRes); }, timeout); }); };Contoh pemanggilan
const KV_TIMEOUT = 1000; let edgekv = new EdgeKV({ namespace: KV_NS, }); let kvRequest = edgekv.get(key, getType); let timeoutPromise = RequestTimeout(KV_TIMEOUT, { handler: { res: {}, errorMessage: `kv request timeout (${KV_TIMEOUT}ms)`, } }); let resp = await Promise.race([ kvRequest, timeoutPromise, ]); if (resp === undefined) { return "kv not found, key = " + key; } else { return resp; }
Redirect
Fetch dapat mengikuti redirect 3xx, termasuk kode status 301, 302, 303, 307, dan 308. Anda dapat menentukan salah satu dari tiga perilaku berikut:
{redirect: "manual"}: Tidak mengikuti redirect 3xx. Anda harus menangani redirect secara manual.{redirect: "error"}: Melemparkan kesalahan untuk respons 3xx.{redirect: "follow"}: (Default) Mengikuti redirect 3xx hingga maksimal 20 kali.
Metode pengalihan dijelaskan dalam tabel berikut.
Kode status | Rincian pengalihan |
301, 302, 303, 308 | Metode permintaan diubah menjadi GET, dan badan diabaikan. |
307 | Hanya metode GET yang diikuti. Kesalahan dilaporkan untuk metode lainnya. |
Alamat pengalihan diambil dari header Location. Header Location wajib tersedia; jika tidak, kesalahan akan dilaporkan.
Header
Locationdapat berisi daftar URL yang dipisahkan koma (,). Hanya URL pertama yang digunakan; sisanya diabaikan.Header
Locationdapat berisi URL absolut atau relatif.
Dekompresi
Fetch API memungkinkan Anda mengonfigurasi mode dekompresi, seperti fetch("https://www.example.com",{decompress: "manual"}). Parameter decompress mendukung nilai-nilai berikut:
manual: Tidak mendekompresi data. Jika server mengembalikan data terkompresi saat permintaan fetch, data yang diterima oleh EdgeRoutine (ER) tetap terkompresi.
decompress: Secara otomatis mendekompresi data. Ini adalah nilai default. Fetch API mendukung kompresi Gzip. ER secara otomatis mendeteksi dan mendekompresi data berdasarkan header Content-Encoding. Setelah dekompresi, ER mengubah nilai Content-Encoding. Jika parameter Gzip dihapus, Anda dapat mengonfigurasi pengaturan berikut untuk mencegah pengecualian selama transmisi data:
content-encoding: gzip: ER mengenali nilai
Content-Encodingdan mendekompresi data.content-encoding: gzip, identity: ER mengenali nilai
Content-Encodingdan mendekompresi data.
CatatanAlgoritma selain Gzip menyebabkan pengecualian.
fallbackIdentity: Efeknya mirip dengan decompress. Jika ER tidak dapat mengenali nilai tersebut, data tidak didekompresi.
Setelah Fetch API secara otomatis mendekompresi data, Anda tidak dapat meneruskan header Content-Length sesuai kebutuhan jika respons berisi header tersebut. Hal ini karena Content-Length menunjukkan ukuran data sebelum dekompresi.
content-length
Jika Anda mengatur content-length dalam permintaan fetch, Fetch menggunakan encoding content-length dan menggantikan perilaku default pengiriman badan. Jika content-length tidak diatur, Fetch membaca dan mengirim seluruh data dari aliran badan menggunakan encoding chunked.
Pengaturan
content-lengthJika
content-lengthbernilai non-negatif, Fetch membaca dan mengirim jumlah byte yang ditentukan dari aliran badan menggunakan encodingcontent-length. Jikacontent-lengthbernilai 0, tidak ada data yang dikirim.Jika
content-lengthtidak valid, Fetch mengirim seluruh data dalam badan menggunakan encoding chunked.
Contoh
Fetch secara otomatis mendekompresi konten. Setelah dekompresi, header
content-lengthdalam respons tetap ada. Headercontent-lengthini menunjukkan ukuran data sebelum dekompresi. Jika Anda memodifikasi badan sebelum menggunakan Fetch, perhatikancontent-length. Jika tidak, konten yang dikirim mungkin salah.Dalam contoh berikut, asumsikan klien mengirim permintaan POST yang menyertakan header
content-length. Jika Anda membuat permintaan baru menggunakan Fetch dan menggunakan kembali objek header dari permintaan klien, nilaicontent-lengthmungkin tidak konsisten dengan ukuran aktual badan yang dikirim. Saat meneruskan header, selalu verifikasi apakah ukuran badan aktual telah berubah.export default { fetch(request) { return handleRequest(request) } } async function handleRequest(request) { return fetch("http://www.example.com", { headers: request.headers, method: request.method, body: "SomeData" }); }
Header
Definisi
Untuk informasi lebih lanjut tentang objek Headers, lihat Headers.
Batasan
Header mencatat jumlah sumber daya memori yang dikonsumsi. Ukuran maksimum objek Headers adalah 8 KB. Jika melebihi batas ini, pengecualian JavaScript akan dilemparkan.
Blacklist
Fetch API menggunakan blacklist header. Jika Anda mencoba membaca atau menulis header yang termasuk dalam blacklist, pengecualian akan dilemparkan. Tabel berikut menjelaskan header yang termasuk dalam blacklist.
expect
te
trailer
upgrade
proxy-connection
connection
keep-alive
dnt
host
Header yang dicadangkan
Request
Definisi
Untuk informasi lebih lanjut, lihat dokumentasi MDN untuk Request.
Batasan
Properti-properti berikut dari objek Request tidak diimplementasikan dan tidak berlaku dalam konteks CDN, DCDN, atau ESA:
context
credentials
destination
integrity
mode
referrer
referrerPolicy
cache
Penggunaan umum
Ambil metode permintaan:
request.method.Ambil URL permintaan:
request.url.Ambil header permintaan:
request.headers.Ambil muatan permintaan:
request.body. Badan ini merupakan objek ReadableStream.Ambil JSON:
await request.json().Ambil data formulir:
await request.formData().Ambil string UTF-8:
await request.text().
Antarmuka Request merupakan perluasan dari standar dan memungkinkan Anda mengabaikan badan permintaan sekaligus memastikan aliran badan sepenuhnya dibaca dari soket dasar. Badan tidak dimuat ke dalam memori mesin virtual JavaScript, sehingga menghindari penundaan pengumpulan sampah (GC). Jika Anda tidak perlu membaca badan permintaan Fetch, panggil
request.ignore, misalnyaawait request.ignore(). Hal ini meningkatkan performa karena runtime secara otomatis mengembalikan koneksi ke kolam koneksi untuk digunakan kembali setelah badan sepenuhnya dibaca.
Response
Definisi
Untuk informasi lebih lanjut, lihat dokumentasi MDN untuk Response.
Batasan
Properti useFinalURLS dan error dari objek Response tidak diimplementasikan dan tidak berlaku dalam konteks CDN, DCDN, atau ESA.
Penggunaan umum
Ambil kode respons:
response.status.Ambil frasa alasan respons:
response.statusText.Ambil header respons:
response.headers.Ambil URL respons:
response.url. Ini adalah URL akhir setelah semua redirect.Ambil daftar semua URL redirect (non-standar):
response.urlList. Objek Response mengimplementasikan mixin badan, mirip dengan objek Request. Anda dapat menggunakan metode serupa untuk mengambil objek badan.
FormData
Definisi
Untuk informasi lebih lanjut tentang operasi FormData, lihat FormData.
Batasan
Operasi FormData mirip dengan operasi Headers dan membatasi ukuran header. Jika ukuran header melebihi batas atas, pengecualian akan dilemparkan. Jika Anda mengirim FormData sebagai badan permintaan HTTP,
content-typesecara default diatur keform-data/multipart.
URLSearchParams
Definisi
Untuk informasi lebih lanjut tentang operasi URLSearchParams, lihat URLSearchParams().
Batasan
Jika Anda mengirim URLSearchParams sebagai badan permintaan HTTP,
content-typesecara default diatur keapplication/x-www-form-urlencoded. Ukuran data tidak boleh melebihi 1.000 byte.
Blob dan File
Definisi
Batasan
ER mendukung kelas Blob dan File sesuai standar. Namun, ER tidak dapat membaca atau menulis file. Anda dapat meneruskan objek Blob dan File yang didukung ER ke badan respons. Nilai header
content-typeakan sama dengan tipe MIME yang ditentukan dalam operasiBlobatauFile.