With jQuery and other JavaScript libraries you can easily make AJAX calls using something like this:
$.ajax({
url: "miURl",
method: "GET",
data: "var1=valor1&var2=valor2",
success: function(d) {
// código aquí
}
});
The problem is that in some projects I have found that I added JavaScript libraries exclusively to use the AJAX function and for quite basic calls (mainly GETs in which I did not care about the error, only the result, if any)... and not it makes a lot of sense to add an 85-300KB file just for that.
What would a basic JavaScript function look like that takes a URL as a parameter, a function that will do success
(I don't care about the error
) and optionally the method (GET or POST), a list of variables, and work "similar" to how does it do it jQuery.ajax
?
The response must be independent of the server it is running on and if that is not possible then it must work for Apache.
Whatever library you use, everything is converted to the same code (or similar, but using the same standards) and the server will interpret the same request.
Source: How does AJAX work? .
You take care of the orange part , the rest is predefined on the servers.
I'm going to split my answer into 2 timelines ;)
Old School
This form is the classic and practically multi-browser, as well as being the standard for many years. The class that provides us with this is the XMLHttpRequest interface .
Just create an object
XMLHttpRequest
:open
Then, we must specify the following parameters through the method :Continuing with the example, we can do the following:
With this we already establish the parameters to the request. It remains for us to associate a function for the request phases of the request lifecycle.
These are:
It is for this reason that we must act in the phase
4
, when the answer is ready for us (except in extraordinary cases, as always, it can be acted in other phase(s)):Finally, we send the request:
Annex: Sending data by POST
It is not new that in a request
GET
, we cannot send data in the body of the request; what libraries like jQuery do is read the objects that we pass todata
them and group them by?clave=valor
to finally append them to the URL.Through the method
POST
it is possible to send data, for which we have some options that I mention below.FormData
FormData is an interface that allows us to simulate a
submit
form by sending the data that we add to it asclave/valor
, in fact, this interface uses the mimemultipart/form-data
.Let's look at an example:
manual way
This form is the same as with
FormData
, the difference is that here you do it manually as if it were get parameters:JSON
To send objects via
XMLHttpRequest
just make use ofJSON.stringify
to serialize that object:New school
Promesas
A new API based on , called Fetch , has recently been released . Somehow it makes the code cleaner.GET
To make a request
GET
, just pass theURL
resource and make use ofthen
andcatch
for success and error respectively.Alternatively, if we expect to receive a
JSON
we must include the corresponding header:But there is another reason why this alternative will be widely used and it has to do with an upcoming EcmaScript feature, that is Async/Await .
It's very simple.
Async/Await
will make it possible to wait for an asynchronous procedure to finish, giving us on occasions where we need this behavior, a clear advantage and naturalness to the generally procedural backend programmer. We can understand it better with an example:Conclusions
We currently have transpilers that allow us to use EcmaScript 6,7 and 8 as well as future inclusions in the language without losing cross-browser compatibility. One of the most famous is Babel which transpiles modern code to EcmaScript 5 (JavaScript 2009).
1. Code
I put together this function that follows exactly the same syntax as
jQuery.ajax
and you just have to include it in your code to use it. It is written to be compatible with older browsers as well.Implemented Options
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 promiseThe first example of using promise- driven fetch would now look like this
CLARIFICATIONS
try{....} catch(error){....}
error.message
PASSING A PARAMETER TO A QUERY