You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: 5-network/08-xmlhttprequest/article.md
+60-60Lines changed: 60 additions & 60 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -37,27 +37,27 @@ Para hacer la petición, necesitamos seguir 3 pasos:
37
37
38
38
- `method` -- método HTTP. Usualmente `"GET"` o `"POST"`.
39
39
- `URL` -- la URL a solicitar, una cadena, puede ser un objeto [URL](info:url).
40
-
- `async` -- si se asigna explicítamente a `false`, entonces la petición será asincrónica, Cubriremos esto un poco más adelante.
41
-
- `user`, `password` -- usuario y contraseña para autenticación HTTP básica (si se requiere).
40
+
- `async` -- si se asigna explícitamente a `false`, entonces la petición será asincrónica. Cubriremos esto un poco más adelante.
41
+
- `user`, `password` -- usuario y contraseña para autenticación HTTP básica (si se requiere).
42
42
43
-
Por favor, toma en cuenta que la llamada a `open`, contrario a su nombre, no abre la conección. Solo configura la solicitud, pero la actividad de red solo empieza con la llamada del método `send`.
43
+
Por favor, toma en cuenta que la llamada a `open`, contrario a su nombre, no abre la conexión. Solo configura la solicitud, pero la actividad de red solo empieza con la llamada del método `send`.
44
44
45
45
3. Enviar.
46
46
47
47
```js
48
48
xhr.send([body])
49
49
```
50
50
51
-
Este método abre la conección y envía ka solicitud al servidor. El parámetro adicional `body` contiene el cuerpo de la solicitud.
51
+
Este método abre la conexión y envía ka solicitud al servidor. El parámetro adicional `body` contiene el cuerpo de la solicitud.
52
52
53
-
Algunos métodos como `GET` no tienen un cuerpo. Y otros como `POST` usan el parámetro `body` para enviar datos al servidor. Vamos a ver unos ejemplos de eso más tarde.
53
+
Algunos métodos como `GET` no tienen un cuerpo. Y otros como `POST` usan el parámetro `body` para enviar datos al servidor. Vamos a ver unos ejemplos de eso más tarde.
54
54
55
55
4. Escuchar los eventos de respuesta `xhr`.
56
56
57
-
Estos son los tres eventos más comunmente utilizados:
58
-
- `load` -- cuando la solicitud está completa (incluso si el estado HTTP es 400 o 500), y la respuesta se descargó por completo.
59
-
- `error` -- cuando la solicitud no pudo ser realizada satisfactoriamente, ej. red caída o una URL inválida.
60
-
- `progress` -- se dispara periódicamente mientras la respuesta está siendo descargada, reporta cuánto se ha descargado.
57
+
Estos son los tres eventos más comúnmente utilizados:
58
+
- `load` -- cuando la solicitud está; completa (incluso si el estado HTTP es 400 o 500), y la respuesta se descargó por completo.
59
+
- `error` -- cuando la solicitud no pudo ser realizada satisfactoriamente, ej. red caída o una URL inválida.
60
+
- `progress` -- se dispara periódicamente mientras la respuesta está siendo descargada, reporta cuánto se ha descargado.
61
61
62
62
```js
63
63
xhr.onload = function() {
@@ -69,26 +69,26 @@ Para hacer la petición, necesitamos seguir 3 pasos:
69
69
};
70
70
71
71
xhr.onprogress=function(event) { // se dispara periodicamente
72
-
// event.loaded - cuantos bytes se han descargado
72
+
// event.loaded - cuántos bytes se han descargado
73
73
// event.lengthComputable = devuelve true si el servidor envia la cabecera Content-Length (longitud del contenido)
74
-
// event.total - numero total de bytes (si lengthComputable es true)
74
+
// event.total - número total de bytes (si `lengthComputable` es `true`)
75
75
alert(`Recibido ${event.loaded} of ${event.total}`);
76
76
};
77
77
```
78
78
79
-
Aquí un ejemplo completo. El siguiente código carga la URL en `/article/xmlhttprequest/example/load` desde el servidor e imprime el progreso:
79
+
Aquí un ejemplo completo. El siguiente código carga la URL en `/article/xmlhttprequest/example/load` desde el servidor e imprime el progreso:
80
80
81
81
```js run
82
82
// 1. Crea un nuevo objeto XMLHttpRequest
83
83
let xhr = new XMLHttpRequest();
84
84
85
-
// 2. Configuracion: solicitud GET para la URL /article/.../load
85
+
// 2. Configuración: solicitud GET para la URL /article/.../load
@@ -149,10 +149,10 @@ Podemos usar la propiedad `xhr.responseType` para asignar el formato de la respu
149
149
150
150
-`""` (default) -- obtiene una cadena,
151
151
-`"text"`-- obtiene una cadena,
152
-
-`"arraybuffer"`-- obtiene un `ArrayBuffer` (para datos binarios, vee el capítulo<info:arraybuffer-binary-arrays>),
153
-
-`"blob"`-- obtiene un `Blob` (para datos binarios, vee el capítulo<info:blob>),
154
-
-`"document"`-- obtiene un documento XML (puede usar XPath y otros métodosXML),
155
-
-`"json"`-- obtiene un JSON (automáticamente analizado).
152
+
-`"arraybuffer"`-- obtiene un `ArrayBuffer` (para datos binarios, vee el capítulo<info:arraybuffer-binary-arrays>),
153
+
-`"blob"`-- obtiene un `Blob` (para datos binarios, ver el capítulo<info:blob>),
154
+
-`"document"`-- obtiene un documento XML (puede usar XPath y otros métodosXML),
155
+
-`"json"`-- obtiene un JSON (automáticamente analizado).
156
156
157
157
Por ejemplo, obtengamos una respuesta como JSON:
158
158
@@ -175,26 +175,26 @@ xhr.onload = function() {
175
175
```
176
176
177
177
```smart
178
-
En los scripts antigüos debes encontrar también las propiedades `xhr.responseText` e incluso `xhr.responseXML`.
178
+
En los scripts antiguos puedes encontrar también las propiedades `xhr.responseText` e incluso `xhr.responseXML`.
179
179
180
-
Existen por razones históricas, para obtener ya sea una cadena o un documento XML. Hoy en día, debemos seleccionar el formato en `xhr.responseType` y obtener `xhr.response` como se demuestra debajo.
180
+
Existen por razones históricas, para obtener ya sea una cadena o un documento XML. Hoy en día, debemos seleccionar el formato en `xhr.responseType` y obtener `xhr.response` como se demuestra debajo.
181
181
```
182
182
183
183
## Estados
184
184
185
185
`XMLHttpRequest` cambia entre estados a medida que avanza. El estado actual es accesible como `xhr.readyState`.
186
186
187
-
Todos los estados, como en [la especificación](https://xhr.spec.whatwg.org/#states):
187
+
Todos los estados, como en [la especificación](https://xhr.spec.whatwg.org/#states):
188
188
189
189
```js
190
190
UNSENT = 0; // estado inicial
191
191
OPENED = 1; // llamada abierta
192
192
HEADERS_RECEIVED = 2; // cabeceras de respuesta recibidas
193
-
LOADING = 3; // la respuesta esta cargando (un paquete de datos es recibido)
193
+
LOADING = 3; // la respuesta está cargando (un paquete de datos es recibido)
194
194
DONE = 4; // solicitud completa
195
195
```
196
196
197
-
Un objeto `XMLHttpRequest` escala en orden `0`->`1`->`2`->`3`->...->`3`->`4`. El estado `3` se repite cada vez que un paquete de datos se recibe a travéz de la red.
197
+
Un objeto `XMLHttpRequest` escala en orden `0`->`1`->`2`->`3`->...->`3`->`4`. El estado `3` se repite cada vez que un paquete de datos se recibe a través de la red.
198
198
199
199
Podemos seguirlos usando el evento `readystatechange`:
Puedes encontrar oyentes del evento `readystatechange` en código realmente viejo, está ahí por razones históricas, había un tiempo cuando no había`load` y otros evento. Hoy en día, los manipuladores `load/error/progress` lo hacen obsoleto.
212
+
Puedes encontrar oyentes del evento `readystatechange` en código realmente viejo, está ahí por razones históricas, había un tiempo cuando no existían`load` y otros eventos. Hoy en día los manipuladores `load/error/progress` lo hacen obsoleto.
213
213
214
214
## Abortando solicitudes
215
215
@@ -221,13 +221,13 @@ xhr.abort(); // termina la solicitud
221
221
222
222
Este dispara el evento `abort`, y el `xhr.status` se convierte en `0`.
223
223
224
-
## Solicitudes sincrónicas
224
+
## Solicitudes sincrónicas
225
225
226
-
Si en el método`open` el tercer parámetro`async` se asigna como `false`, la solicitud se hace sincrónicamente.
226
+
Si en el método`open` el tercer parámetro`async` se asigna como `false`, la solicitud se hace sincrónicamente.
227
227
228
-
En otras palabras, la ejecución de JavaScript se pause en el `send()` y se resume cuando la respuesta es recibida. Algo como comandos `alert` o `prompt`.
228
+
En otras palabras, la ejecución de JavaScript se pausa en el `send()` y se reanuda cuando la respuesta es recibida. Algo como los comandos `alert` o `prompt`.
229
229
230
-
Aquí está el ejemplo reescrito, el tercer parámetro de `open` es `false`:
230
+
Aquí está el ejemplo reescrito, el tercer parámetro de `open` es `false`:
231
231
232
232
```js
233
233
let xhr = new XMLHttpRequest();
@@ -246,17 +246,17 @@ try {
246
246
}
247
247
```
248
248
249
-
Puede verse bien, pero las llamadas sincrónicas son rara vez utilizadas, porque bloquean todo el JavaScript de la página hasta que la carga estécompleta. En algunos navegadores se hace imposible hacer scroll. Si una llamada síncrona toma mucho tiempo, el navegador puede sugerir cerrar el sitio web "colgado".
249
+
Puede verse bien, pero las llamadas sincrónicas son rara vez utilizadas porque bloquean todo el JavaScript de la página hasta que la carga estácompleta. En algunos navegadores se hace imposible hacer scroll. Si una llamada síncrona toma mucho tiempo, el navegador puede sugerir cerrar el sitio web "colgado".
250
250
251
-
Algunas capacidades avanzadas de `XMLHttpRequest`, como solicitar desde otro dominio o especificando un tiempo límite, no están disponibles para solicitudes síncronas. También, como puedes ver, sin indicación de progreso.
251
+
Algunas capacidades avanzadas de `XMLHttpRequest`, como solicitar desde otro dominio o especificar un tiempo límite, no están disponibles para solicitudes síncronas. Tampoco, como puedes ver, la indicación de progreso.
252
252
253
-
La razón de esto, es que las solicitudes sincrónicas son utilizadas muy escasamente, casi nunca. No hablaremos más sobre ellas.
253
+
La razón de esto es que las solicitudes sincrónicas son utilizadas muy escasamente, casi nunca. No hablaremos más sobre ellas.
254
254
255
255
## Cabeceras HTTP
256
256
257
257
`XMLHttpRequest` permite tanto enviar cabeceras personalizadas como leer cabeceras de la respuesta.
258
258
259
-
Existen 3metodos para las cabeceras HTTP:
259
+
Existen 3métodos para las cabeceras HTTP:
260
260
261
261
`setRequestHeader(name, value)`
262
262
: Asigna la cabecera de la solicitud con los valores `name` y `value` provistos.
@@ -269,23 +269,23 @@ Existen 3 metodos para las cabeceras HTTP:
269
269
270
270
```warn header="Limitaciones de cabeceras"
271
271
Muchas cabeceras se administran exclusivamente por el navegador, ej. `Referer` y `Host`.
272
-
La lista completa está [en la especificacián](http://www.w3.org/TR/XMLHttpRequest/#the-setrequestheader-method).
272
+
La lista completa está [en la especificación](http://www.w3.org/TR/XMLHttpRequest/#the-setrequestheader-method).
273
273
274
-
`XMLHttpRequest` no está permitido cambiarlos, por motivos de seguridad del usuario y la exactitud de la solicitud.
274
+
`XMLHttpRequest` no está permitido cambiarlos, por motivos de seguridad del usuario y la exactitud de la solicitud.
275
275
```
276
276
277
277
````warn header="No se pueden eliminar cabeceras"
278
278
Otra peculiaridad de `XMLHttpRequest` es que no puede deshacer un `setRequestHeader`.
279
279
280
-
Una vez que una cabecera es asignada, ya estáasignada. Llamadas adicionales agregan información a la cabecera, no la sobre-escriben.
280
+
Una vez que una cabecera es asignada, ya estáasignada. Llamadas adicionales agregan información a la cabecera, no la sobreescriben.
281
281
282
282
Por ejemplo:
283
283
284
284
```js
285
285
xhr.setRequestHeader('X-Auth', '123');
286
286
xhr.setRequestHeader('X-Auth', '456');
287
287
288
-
// la cabecera será:
288
+
// la cabecera será:
289
289
// X-Auth: 123, 456
290
290
```
291
291
````
@@ -302,7 +302,7 @@ Existen 3 metodos para las cabeceras HTTP:
302
302
`getAllResponseHeaders()`
303
303
: Devuelve todas las cabeceras de la respuesta, excepto por `Set-Cookie` y `Set-Cookie2`.
304
304
305
-
Las cabeceras se devuelven como una sola línea, ej.:
305
+
Las cabeceras se devuelven como una sola línea, ej.:
306
306
307
307
```http
308
308
Cache-Control: max-age=31536000
@@ -311,11 +311,11 @@ Existen 3 metodos para las cabeceras HTTP:
311
311
Date: Sat, 08 Sep 2012 16:53:16 GMT
312
312
```
313
313
314
-
El salto de línea entre las cabeceras siempre es un `"\r\n"` (independiente del SO), así podemos dividirlas en cabeceras individuales. El separador entre el nombre y el valor siempre es dos puntos seguido de un espacio `": "`. Esose fija en la especificación.
314
+
El salto de línea entre las cabeceras siempre es un `"\r\n"` (independiente del SO), así podemos dividirlas en cabeceras individuales. El separador entre el nombre y el valor siempre es dos puntos seguido de un espacio `": "`. Esoquedó establecido en la especificación.
315
315
316
-
Así, si queremos obtener un objeto con pares nombre/valor, necesitamos tratarlas con un poco de JS.
316
+
Así, si queremos obtener un objeto con pares nombre/valor, necesitamos tratarlas con un poco de JS.
317
317
318
-
Como esto (asumiendo que si dos cabeceras tienen el mismo nombre, entonces el último sobreecribe al primero):
318
+
Como esto (asumiendo que si dos cabeceras tienen el mismo nombre, entonces el útimo sobreecribe al primero):
319
319
320
320
```js
321
321
let headers = xhr
@@ -338,12 +338,12 @@ La sintaxis:
338
338
339
339
```js
340
340
let formData = new FormData([form]); // crea un objeto, opcionalmente se completa con un <form>
341
-
formData.append(name, value); // añade un campo
341
+
formData.append(name, value); // añade un campo
342
342
```
343
343
344
-
Lo creamos, opcionalmente lleno desde un formulario, `append` (agrega) más campos si se necesitan, y entonces:
344
+
Lo creamos, opcionalmente lleno desde un formulario, `append` (agrega) más campos si se necesitan, y entonces:
345
345
346
-
1.`xhr.open('POST', ...)` – se utiliza el método`POST`.
346
+
1.`xhr.open('POST', ...)` – se utiliza el método`POST`.
347
347
2.`xhr.send(formData)` para enviar el formulario al servidor.
348
348
349
349
Por ejemplo:
@@ -358,7 +358,7 @@ Por ejemplo:
358
358
// pre llenado del objeto FormData desde el formulario
359
359
let formData = new FormData(document.forms.person);
360
360
361
-
// agrega un campo más
361
+
// agrega un campo más
362
362
formData.append("middle", "Lee");
363
363
364
364
// lo enviamos
@@ -370,11 +370,11 @@ Por ejemplo:
370
370
</script>
371
371
```
372
372
373
-
El formulario fue enviado con codificación`multipart/form-data`.
373
+
El formulario fue enviado con codificación`multipart/form-data`.
374
374
375
-
O, si nos gusta másJSON, entonces, un `JSON.stringify` y lo enviamos como un string.
375
+
O, si nos gusta másJSON, entonces, un `JSON.stringify` y lo enviamos como un string.
376
376
377
-
Solo no te olvides de asignar la cabecera `Content-Type: application/json`, muchos frameworks del lado del servidor decodifican automáticamenteJSON con este:
377
+
Solo no te olvides de asignar la cabecera `Content-Type: application/json`, muchos frameworks del lado del servidor decodifican automáticamenteJSON con este:
El método`.send(body)` es bastante omnivoro. Puede enviar casi cualquier `body`, incluyendo objetos `Blob` y `BufferSource`.
393
+
El método`.send(body)` es bastante omnívoro. Puede enviar casi cualquier `body`, incluyendo objetos `Blob` y `BufferSource`.
394
394
395
395
## Progreso de carga
396
396
397
397
El evento `progress` se dispara solo en la fase de descarga.
398
398
399
399
Esto es: si hacemos un `POST` de algo, `XMLHttpRequest` primero sube nuestros datos (el cuerpo de la respuesta), entonces descarga la respuesta.
400
400
401
-
Si estamos subiendo algo grande, entonces seguramente estaremos interesados en rastrear el progreso de nuestra carga. Pero`xhr.onprogress` no ayuda aquí.
401
+
Si estamos subiendo algo grande, entonces seguramente estaremos interesados en rastrear el progreso de nuestra carga. Pero`xhr.onprogress` no ayuda aquí.
402
402
403
-
Hay otro objeto, sin métodos, exclusivamente para rastrear los eventos de subida:`xhr.upload`.
403
+
Hay otro objeto, sin métodos, exclusivamente para rastrear los eventos de subida:`xhr.upload`.
404
404
405
405
Éste genera eventos, similares a `xhr`, pero `xhr.upload` se dispara solo en las subidas:
0 commit comments