Obtenga datos desde los POP perimetrales mediante HTTP o HTTPS. La API Fetch funciona igual que la API Fetch del navegador y es compatible con la carga dinámica de contenido, la interacción con el backend y las pruebas A/B.
Definición del método
Fetch es completamente asíncrono y no bloquea la ejecución del script a menos que utilice await. Se admiten hasta cuatro subpeticiones simultáneas. Las conexiones persistentes se gestionan internamente.
Fetch es compatible con peticiones HTTP y HTTPS. Cada redirect cuenta como una subpetición, con un máximo de 12 operaciones de redirect por petición.
-
Definición del método
fetch(arg, init). Este método sigue la especificación MDN WorkerOrGlobalScope.fetch(). -
Límites del método
La API Fetch solo admite nombres de dominio, no direcciones IP. Puertos predeterminados: 80 (HTTP), 443 (HTTPS).
Las propiedades
credentials,referrer,referrerPolicy,cacheeintegritydel parámetroinitno tienen ningún efecto.El valor predeterminado de
redirectesfollow, lo cual sigue las respuestas 3xx del origen. Establezcaredirectenmanualpara deshabilitar el seguimiento de redirecciones.
NotaLos modos Fetch específicos del navegador no aplican. En CDN, DCDN o ESA,
CROS fetchpermite recuperar datos de cualquier origen.La longitud total de una URL de petición no puede superar los 4 KB.
Los recursos comprimidos con gzip que se obtienen se descomprimen de forma predeterminada. Agregue el parámetro
manualpara deshabilitar la descompresión. La sección Descompresión detalla este proceso.
-
Establezca un periodo de tiempo de espera
-
Función de tiempo de espera
/** * Request timeout control implementation * * @param {Number} timeout Timeout period, in ms * @param {Object} config Timeout configuration * - @param {Object|Funtion} handler Value to return on 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); }); }; -
Ejemplo de llamada
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; }
-
Redirección
Fetch sigue las redirecciones 3xx (301, 302, 303, 307, 308). Especifique uno de estos tres comportamientos de redirección:
{redirect: "manual"}: No sigue las redirecciones 3xx. Usted debe gestionarlas manualmente.{redirect: "error"}: Se genera un error ante respuestas 3xx.{redirect: "follow"}: (Predeterminado) Sigue las redirecciones 3xx. Se pueden seguir hasta 20 redirecciones como máximo.
Comportamiento de redirección según el código de estado:
|
Código de estado |
Detalles de la redirección |
|
301, 302, 303, 308 |
El método de la petición cambia a GET y se ignora el cuerpo. |
|
307 |
Solo se siguen los métodos GET. Para otros métodos se reporta un error. |
Las redirecciones usan el encabezado Location, el cual es obligatorio. Si falta el encabezado Location, se produce un error.
El encabezado
Locationpuede contener una lista de URL separadas por comas (,). Solo se utiliza la primera URL y se ignoran las demás.El encabezado
Locationpuede contener una URL absoluta o una URL relativa.
Descompresión
La API Fetch le permite configurar un modo de descompresión, por ejemplo: fetch("https://www.example.com",{decompress: "manual"}). El parámetro decompress admite los siguientes valores:
manual: no descomprime los datos. Si el servidor devuelve datos comprimidos ante una petición fetch, los datos que recibe EdgeRoutine (ER) también estarán comprimidos.
-
decompress: descomprime los datos automáticamente. Este es el valor predeterminado. La API Fetch es compatible con la compresión Gzip. ER detecta o descomprime los datos automáticamente según el encabezado Content-Encoding. Después de descomprimirlos, ER modifica el valor de Content-Encoding. Si se elimina el parámetro Gzip, configure los siguientes ajustes para evitar excepciones durante la transmisión de datos:
content-encoding: gzip: ER reconoce el valor de Content-Encoding y descomprime los datos.content-encoding: gzip, identity: ER reconoce el valor de Content-Encoding y descomprime los datos.
NotaLos algoritmos distintos de Gzip provocan excepciones.
fallbackIdentity: Este valor tiene un efecto similar al de decompress. Si ER no lo reconoce, no descomprime los datos.
Después de que la API Fetch descomprime los datos automáticamente, no es posible pasar el encabezado Content-Length según se requiera si la respuesta lo contiene. Esto ocurre porque dicho encabezado indica el tamaño de los datos antes de la descompresión.
content-length
Cuando se establece content-length, Fetch envía el cuerpo con la codificación content-length. Sin content-length, Fetch envía todos los datos del cuerpo mediante codificación fragmentada (chunked).
-
Configuraciones de
content-lengthSi
content-lengthes un número no negativo: Fetch lee y envía la cantidad especificada de bytes desde el flujo del cuerpo. Los datos se envían con la codificacióncontent-length. Sicontent-lengthes 0, no se envían datos.Si
content-lengthtiene un valor no válido: Fetch envía todos los datos del cuerpo mediante codificación fragmentada.
-
Ejemplo
Fetch descomprime el contenido automáticamente. El encabezado
content-lengthde la respuesta sigue reflejando el tamaño previo a la descompresión. Si modifica el cuerpo antes de reenviarlo, compruebe quecontent-lengthcoincida con el tamaño real del cuerpo. Una discrepancia encontent-lengthprovoca una entrega incorrecta del contenido.En este ejemplo, un cliente envía una petición POST con un encabezado
content-length. Si crea una nueva petición Fetch que reutiliza los encabezados del cliente, es posible quecontent-lengthno coincida con el nuevo tamaño del cuerpo. Compruebe siempre el tamaño del cuerpo cuando pase los encabezados.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" }); }
Headers
-
Definición
Para obtener más información sobre el objeto Headers, consulte Headers.
-
Límites
Un encabezado registra la cantidad de recursos de memoria consumidos. El tamaño máximo de un objeto Headers es de 8 KB. Si el tamaño de un objeto Headers supera este límite, se genera una excepción de JavaScript.
-
Lista de bloqueo
La API Fetch utiliza una lista de bloqueo de encabezados. Si intenta leer o escribir un encabezado incluido en dicha lista, se genera una excepción. A continuación se describen los encabezados incluidos en la lista de bloqueo.
expect
te
trailer
upgrade
proxy-connection
connection
keep-alive
dnt
host
Encabezados reservados
Request
-
Definición
Sigue la especificación MDN Request.
-
Límites
Las siguientes propiedades de Request no son compatibles con CDN, DCDN ni ESA.
context
credentials
destination
integrity
mode
referrer
referrerPolicy
cache
-
Usos comunes
Recuperar el método de la petición:
request.method.Recuperar la URL de la petición:
request.url.Recuperar los encabezados de la petición:
request.headers.Recuperar la carga útil de la petición:
request.body. El cuerpo es un objeto ReadableStream.Recuperar JSON:
await request.json().Recuperar datos de formulario:
await request.formData().Recuperar una cadena UTF-8:
await request.text().
Como extensión no estándar,
request.ignorevacía el flujo del cuerpo a nivel de socket sin cargarlo en la memoria de la máquina virtual de JavaScript, lo cual evita retrasos del recolector de basura. Llame aawait request.ignore()cuando no necesite el cuerpo de la petición. El entorno de ejecución devuelve la conexión al pool después de leer el cuerpo por completo.
Response
-
Definición
Sigue la especificación MDN Response.
-
Límites
Las propiedades useFinalURLS y error no son compatibles con CDN, DCDN ni ESA.
-
Usos comunes
Recuperar el código de respuesta:
response.status.Recuperar la frase de motivo de la respuesta:
response.statusText.Recuperar los encabezados de la respuesta:
response.headers.Recuperar la URL de la respuesta:
response.url. Esta es la URL final después de todas las redirecciones.Recuperar todas las URL de redirección (no estándar):
response.urlList. Response implementa un mixin de cuerpo igual que Request, por lo que aplican los mismos métodos para recuperar el cuerpo.
FormData
-
Definición
Para obtener más información sobre la operación FormData, consulte FormData.
-
Límites
La operación FormData es similar a la operación Headers. FormData limita el tamaño de los encabezados. Si el tamaño de un encabezado supera el límite superior, se genera una excepción. Si envía FormData como cuerpo de una petición HTTP,
content-typese establece enform-data/multipartde forma predeterminada.
URLSearchParams
-
Definición
Para obtener más información sobre la operación URLSearchParams, consulte URLSearchParams().
-
Límites
Si envía URLSearchParams como cuerpo de una petición HTTP,
content-typese establece enapplication/x-www-form-urlencodede forma predeterminada. El tamaño de los datos no puede superar los 1,000 bytes.
Blob y File
-
Definición
-
Límites
ER es compatible con las clases Blob y File, las cuales cumplen con los estándares de las operaciones Blob y File. ER no puede leer ni escribir archivos. Puede pasar las clases Blob y File compatibles con ER al cuerpo de la respuesta. El valor del encabezado
content-typees el mismo que el tipo MIME de la operaciónBloboFile.