使用 jQuery 和其他 JavaScript 库,您可以使用以下方式轻松进行 AJAX 调用:
$.ajax({
url: "miURl",
method: "GET",
data: "var1=valor1&var2=valor2",
success: function(d) {
// código aquí
}
});
问题是,在某些项目中,我发现我添加 JavaScript 库专门用于使用 AJAX 函数和非常基本的调用(主要是 GET,其中我不关心错误,只关心结果,如果有的话)......和仅仅为此添加一个 85-300KB 的文件并不是很有意义。
一个基本的 JavaScript 函数是什么success
样子error
的它是如何做到的jQuery.ajax
?
响应必须独立于它运行的服务器,如果不可能,那么它必须适用于 Apache。
无论您使用什么库,所有内容都将转换为相同的代码(或类似的代码,但使用相同的标准),服务器将解释相同的请求。
资料来源:AJAX 是如何工作的?.
您负责橙色部分,其余部分在服务器上预定义。
我将把我的答案分成 2 个时间线;)
老套
这种形式是经典且实用的多浏览器,也是多年来的标准。为我们提供这个的类是XMLHttpRequest接口。
只需创建一个对象
XMLHttpRequest
:然后,我们必须通过方法指定
open
以下参数:继续示例,我们可以执行以下操作:
有了这个,我们已经为请求建立了参数。我们仍然需要为请求生命周期的请求阶段关联一个函数。
这些是:
正是出于这个原因,我们必须在 阶段 行动
4
,当答案为我们准备好时(除了特殊情况,一如既往,它可以在其他阶段行动):最后,我们发送请求:
附件:POST发送数据
GET
在请求中,我们不能在请求的正文中发送数据,这并不是什么新鲜事;像 jQuery 这样的库所做的是读取我们传递给data
它们的对象并将它们分组?clave=valor
以最终将它们附加到 URL。通过该方法
POST
可以发送数据,为此我们有一些我在下面提到的选项。表单数据
FormData是一个接口,它允许我们
submit
通过发送我们添加到它的数据来模拟表单clave/valor
,事实上,这个接口使用 mimemultipart/form-data
。让我们看一个例子:
手动方式
这种形式和 with 是一样的
FormData
,不同的是这里你像获取参数一样手动操作:JSON
要通过
XMLHttpRequest
仅使用JSON.stringify
序列化该对象来发送对象:新学校
最近发布了一个基于Fetch
Promesas
的新 API 。不知何故,它使代码更干净。得到
要发出请求,只需传递资源的 并使用和分别表示成功和错误
GET
就足够了。URL
then
catch
或者,如果我们希望收到 a
JSON
我们必须包含相应的标头:但是这个替代方案将被广泛使用还有另一个原因,它与即将推出的EcmaScript 功能有关,即Async/ Await 。
这很简单。
Async/Await
将使等待异步过程完成成为可能,在我们需要这种行为的情况下为我们提供了一个明显的优势和对一般程序后端程序员的自然性。我们可以通过一个例子更好地理解它:结论
我们目前有转译器,允许我们使用EcmaScript 6,7 和 8 以及该语言中的未来包含,而不会失去跨浏览器的兼容性。最著名的之一是将现代代码转换为 EcmaScript 5 (JavaScript 2009)的Babel 。
1. 代码
我把这个函数放在一起,它的语法与你完全相同
jQuery.ajax
,你只需将它包含在你的代码中就可以使用它。它也被编写为与旧浏览器兼容。已实施的选项
beforeSend
,cache
,complete
,contentType
,data
(sólo objetos y arrays),dataType
(sólo xml y json),error
,headers
,method
,mimeType
,password
,processData
,statusCode
,success
,timeout
,type
,url
,username
,xhr
.Para ver la forma de usarlos, se puede leer la documentación de jQuery.ajax.
Ejemplos de uso
Obtener el contenido de una url.
Enviar encabezados, obtener un XML y aplicarle métodos de DOM, o evaluar el error.
Enviar parámetros por POST y recibir un JSON
2. Descripción de cómo funciona
2.a. Pasos básicos
Veamos los pasos esenciales de la solicitud AJAX (lo que importa de todo el código).
Instanciamos
XmlHttp
En realidad se recibe como resultado de la función
crearObjetoXMLHttp()
.Esta función está para la compatibilidad con IE. Si no es compatible con
XMLHttpRequest
, genera el objeto ActiveXMSXML2.XmlHttp.6.0
(o una versión previa que sí sea compatible).Registramos el evento
onreadystatechange
para gestionarlo.Para cada cambio en el estado de la petición AJAX, se llamará a la función
respuestaAJAX()
.Nuevamente, definimos una función para lidiar con versiones previas de IE, llamando a
addEvent()
para que, si no es compatible conaddEventListener
, useattachEvent
o, en su defecto, lo asigne directamente a.onreadystatechange
.Inicializamos la petición AJAX y lo enviamos.
Donde se pasa
"POST"
o"GET"
dentro del parámetroopciones.method
. Ydata
puede contener el cuerpo de la petición o no (discutido más abajo).Recibimos la respuesta y se dispara la función
respuestaAJAX()
(registrada en el punto 2).La petición se realiza de forma asíncronica, y la función
ajax()
termina de ejecutarse antes de recibir la respuesta. Sin embargo, al recibir cambios en el estado de la petición, el eventoreadystatechange
va cambiando y llamando a la función que asignamos.De todos los cambios de estado, únicamente nos interesa el último, cuando la petición terminó:
Y, si se obtuvo una respuesta satisfactoria, ejecutamos la función definida por el usuario (pasada como callback).
Esto es todo lo que se necesita para una petición AJAX. El resto del código se encarga exclusivamente de modificar algunos parámetros enviados o recibidos, y de disparar eventos en caso de error.
2.b Envío de datos
Recién vimos que se podían enviar o no datos en
http_request.send(data);
. Éstos son pasados como parámetro dentro de las opciones como string:o como un objeto:
Si se pasan como string, se codifica con
encodeURI()
y lo asignamos:Y si se pasan como objeto, se codifica cada clave y valor con
encodeURIComponent()
:Por último, si estamos realizando una petición por
POST
, los datos se envían directamente en el cuerpo de la petición, en la formavar1=valor1&var2=valor2
y se configura el encabezado deContent-Type
:Pero si es una petición por
GET
, los datos se agregan directamente en la URL, quedando por ejemplopagina.php?var1=valor1&var2=valor2
.2.c Análisis de la respuesta
A la función se le puede pasar el parámetro
dataType
con el valor"json"
o"xml"
para especificar el tipo de datos recibido en la solicitud, haciendo que se procese la respuesta conjson.PARSE()
o directamente obteniendo elXMLHttpRequest.responseXML
.Por otro lado, si
http_request.status
no devuelve un valor en el rango de 200 a 299 (o 304), significa que el servidor respondió con un error (por ejemplo, "404 Not Found"). En ese caso, si se le pasó una función (o varias) como parámetro deerror
, se ejecuta como callback.3. Alternativa más moderna
Otra opción es utilizar
fetch()
, mucho más práctica y sencilla de utilizar. Esta opción está muy bien descripta en la respuesta de MitsuG. Sin embargo, aún no es compatible con IE ni Safari.Al día de esta respuesta la API Fetch esta soportada por los navegadores en su gran mayoría como lo demuestra la imagen siguiente
EJEMPLO PETICIÓN GET
Tienes una URL almacenada dentro de una variable de este modo
Si hacemos lo siguiente
Obtenemos como resultado lo siguiente
Ahora por medio de la API Fetch pa procesamos de este modo mediante promises
MANEJANDO LOS ERRORES AL MOMENTO DE HACER LA PETICIÓN
Podemos recibir y reconocer los errores de la petición por medio de:
catch(error)
MOSTRANDO EL ERROR EXACTO
Si queremos mostrar el error exacto por el cual no se procesó la petición
GET
podemos añadir alerror
el acceso amessage
que contiene dicho mensajeComo notas he cambiado intencionalmente el nombre de
data
por d solo en una parte del código por lo cual el mensaje será el siguientePASANDO PARÁMETROS A LA PETICIÓN GET
Pasar parámetros a nuestra petición
GET
lo podemos hacer del modo siguienteLa interfaz
URLSerachParams
permite trabajar con parámetros pasados a URLs, se pasa un objeto donde la clave es el referente al nombre de la clave en el json que estamos obteniendo, el valor2
es el valor dinámico que aplicaremos para filtrar de toda la data que solo nos muestre aquel registro que tenga el id 2COMPONIENDO A LA URL CON PARÁMETROS
Hacemos uso de
toString
por que devuelve una cadena de texto que contiene el parámetro a consultar usado en una URL.USO DE ASYNC & AWAIT
Con la implementación de estas 2 características entedemos que una función asíncroma que contiene un elemento precedido por
await
se va a pausar en su ejecución hasta obtener el resultado satisfactorio de la promise使用 Promise驱动的fetch的第一个示例现在看起来像这样
澄清
try{....} catch(error){....}
error.message
将参数传递给查询