{"id":8699,"date":"2019-09-15T15:54:55","date_gmt":"2019-09-15T13:54:55","guid":{"rendered":"https:\/\/www.espai.es\/blog\/?p=8699"},"modified":"2021-09-13T20:09:19","modified_gmt":"2021-09-13T18:09:19","slug":"como-enviar-y-recibir-datos-con-la-api-fetch","status":"publish","type":"post","link":"https:\/\/www.espai.es\/blog\/2019\/09\/como-enviar-y-recibir-datos-con-la-api-fetch\/","title":{"rendered":"\u00bfC\u00f3mo enviar y recibir datos con la API Fetch?"},"content":{"rendered":"<p>En un art\u00edculo anterior vimos el <a href=\"https:\/\/www.espai.es\/blog\/2019\/07\/ajax-con-fetch-api\/\" target=\"_blank\" rel=\"noopener\">funcionamiento b\u00e1sico del API Fetch<\/a>, y en que se diferencia del objeto\u00a0<a href=\"https:\/\/developer.mozilla.org\/es\/docs\/Web\/API\/XMLHttpRequest\" target=\"_blank\" rel=\"noopener\">XMLHttpRequest<\/a> (XHR).<\/p>\n<p>En dicho art\u00edculo nos limitamos a pedir una serie de archivos del servidor Web, concretamente archivos de tipo script. Pero AJAX tambi\u00e9n se usa para intercambiar informaci\u00f3n con el servidor. Por ejemplo, cuando estamos escribiendo una b\u00fasqueda en Google, se nos van sugiriendo posibles b\u00fasquedas; eso tambi\u00e9n es AJAX.<\/p>\n<p>Existen varias formas de intercambiar informaci\u00f3n con el servidor, pero una bastante recomendable consiste en usar el formato JSON.<\/p>\n<p>JSON es simplemente un formato de intercambio de informaci\u00f3n, como lo puedan ser otros como XML o CVS, donde la informaci\u00f3n se formatea del mismo modo que se escribe un objeto en JavaScript. JSON significa JavaScript Object Notation.<\/p>\n<p>Para poder enviar informaci\u00f3n al servidor, necesitamos indicar que informaci\u00f3n queremos enviar, de que forma la queremos enviar, etc.<\/p>\n<p>El m\u00e9todo fetch() tiene un segundo par\u00e1metro opcional en el que podemos indicar un objeto con varias opciones, entre ellas las que necesitamos para indicar todo esto.<\/p>\n<p>Para el pr\u00f3ximo ejemplo vamos a necesitar un archivo PHP llamado <strong>media.php<\/strong> que tendr\u00e1 el siguiente c\u00f3digo:<\/p>\n<pre>&lt;?php\r\nheader(\"Content-type: application\/json; charset=utf-8\");\r\n$input = json_decode(file_get_contents(\"php:\/\/input\"), true);\r\n$output = array(\"media\" =&gt; 0, \"html\" =&gt; \"\");\r\n\r\n$output[\"html\"] .= \"&lt;h1&gt;\".$input['titulo'].\"&lt;\/h1&gt;\";\r\n$output[\"html\"] .= \"&lt;ul&gt;\";\r\nforeach ($input[\"numeros\"] as $value) {\r\n  $output[\"media\"] += $value;\r\n  $output[\"html\"] .= \"&lt;li&gt;\".$value.\"&lt;\/li&gt;\";\r\n}\r\n$output[\"media\"] \/= count($input[\"numeros\"]);\r\n$output[\"html\"] .= \"&lt;\/ul&gt;\";\r\necho json_encode($output);\r\n?&gt;\r\n<\/pre>\n<p>Ahora veamos la parte de JavaScript, de nuevo y por simplicidad usaremos Async\/Await:<\/p>\n<pre>(async () =&gt; {\r\n    try {\r\n        \/\/ en el objeto \u201cdatos\u201d tenemos los datos que vamos a enviar al servidor\r\n        \/\/ en este ejemplo tenemos dos datos; un t\u00edtulo y un array de n\u00fameros\r\n        var datos = { titulo: \"Listado de n\u00fameros\", numeros: [2,4,6,8,10] };\r\n        \/\/ en el objeto init tenemos los par\u00e1metros de la petici\u00f3n AJAX\r\n        var init = {\r\n            \/\/ el m\u00e9todo de env\u00edo de la informaci\u00f3n ser\u00e1 POST\r\n            method: \"POST\",\r\n            headers: { \/\/ cabeceras HTTP\r\n                \/\/ vamos a enviar los datos en formato JSON\r\n                'Content-Type': 'application\/json'\r\n            },\r\n            \/\/ el cuerpo de la petici\u00f3n es una cadena de texto\r\n            \/\/ con los datos en formato JSON\r\n            body: JSON.stringify(datos) \/\/ convertimos el objeto a texto\r\n        };\r\n        \/\/ realizamos la petici\u00f3n AJAX usando fetch\r\n        \/\/ el primer par\u00e1metro es el recurso del servidor al que queremos acceder\r\n        \/\/ en este ejemplo, es un fichero php llamado media.php que se encuentra\r\n        \/\/ dentro de la carpeta .\/php y con el c\u00f3digo PHP que hay arriba.\r\n        \/\/ el segundo par\u00e1metro es el objeto init con la informaci\u00f3n sobre los\r\n        \/\/ datos que queremos enviar, el m\u00e9todo de envio, etc.\r\n        var response = await fetch('.\/php\/media.php', init);\r\n        if (response.ok) {\r\n            \/\/ si la petici\u00f3n se ha resuelto correctamente,\r\n            \/\/ intentamos resolver otra promesa que convierta\r\n            \/\/ lo que nos ha respondido el servidor en un objeto de JavaScript.\r\n            \/\/ si el servidor no ha enviado correctamente la informaci\u00f3n\r\n            \/\/ en formato JSON, no se podr\u00e1n convertir correctamente\r\n            \/\/ los datos a un objeto, por lo que la promesa fallar\u00e1\r\n            \/\/ y esto provocar\u00e1 un error.\r\n            var respuesta = await response.json();\r\n            \/\/ en este ejemplo, el servidor nos devuelve un objeto con dos datos,\r\n            \/\/ la media de los n\u00fameros enviados, y un fragmento de HTML\r\n            \/\/ con un el t\u00edtulo y una lista con los n\u00fameros\r\n            alert(\"La media es: \" + respuesta.media);\r\n            document.write(respuesta.html);\r\n            document.close();\r\n        } else {\r\n            throw new Error(response.statusText);\r\n        }\r\n    } catch (err) {\r\n        console.log(\"Error al realizar la petici\u00f3n AJAX: \" + err.message);\r\n    }\r\n})();\r\n<\/pre>\n<p>En este ejemplo, el servidor genera la informaci\u00f3n en formato JSON a partir de la informaci\u00f3n que env\u00eda el navegador del usuario (la lista de n\u00fameros y el t\u00edtulo).<\/p>\n<p>Si simplemente queremos acceder a un archivo JSON que ya existe en el servidor,\u00a0 haremos lo mismo que cuando quer\u00edamos solicitar un script del servidor, con la \u00fanica diferencia de que, para la segunda promesa, en lugar de usar <strong>response.text()<\/strong> usaremos <strong>response.json()<\/strong> para que nos convierta el texto devuelto por el servidor en un objeto JavaScript.<\/p>\n<pre>(async () =&gt; {\r\n  try {\r\n    var response = await fetch('.\/json\/comarques.json');\r\n    if (response.ok) {\r\n      var datos = await response.json();\r\n      console.log(datos); \/\/ mostramos el objeto en la consola del navegador\r\n      document.write(\"&lt;pre&gt;\"+JSON.stringify(datos, null, 2)+\"&lt;\/pre&gt;\");\r\n      document.close(); \/\/ y en el documento HTML\r\n    } else {\r\n      throw new Error(response.statusText);\r\n    }\r\n  } catch (err) {\r\n    console.log(\"Error al realizar la petici\u00f3n AJAX: \" + err.message);\r\n  }\r\n})();\r\n<\/pre>\n<h2>Opciones de Fetch<\/h2>\n<p>Ya hemos visto que fetch acepta como segundo par\u00e1metro un objeto con varias propiedades. Algunas de las m\u00e1s interesantes son las siguientes:<\/p>\n<ul>\n<li><strong>body<\/strong>: contenido que se env\u00eda en la petici\u00f3n al servidor. Puede ser texto, datos de formulario, datos en formato JSON, etc.<\/li>\n<li><strong>headers<\/strong>: aqu\u00ed podemos indicar una o varias <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/HTTP\/Headers\">cabeceras HTTP<\/a> donde podemos indicar informaci\u00f3n adicional que pueda resultar necesaria para realizar la petici\u00f3n AJAX.<\/li>\n<li><strong>cache<\/strong>: establece la <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/API\/Request\/cache\">forma en la que funcionar\u00e1 la cache<\/a> del navegador. El valor por defecto suele funcionar bastante bien, pero si queremos asegurarnos de obtener un resultado fresco, podemos usar el valor <strong>no-cache<\/strong>. Si no queremos que el resultado se almacene en la cache del navegador, podemos usar <strong>no-store<\/strong>.<\/li>\n<li><strong>method<\/strong>: indica la <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/HTTP\/Methods\">acci\u00f3n que queremos realizar sobre el recurso<\/a>. Por lo general usaremos <strong>GET<\/strong> para obtener un recurso y <strong>POST<\/strong> para enviar informaci\u00f3n a un recurso; pero el m\u00e9todo adecuado por lo general depender\u00e1 del servicio Web o API Web al que estemos accediendo.<\/li>\n<li><strong>redirect<\/strong>: existe la posibilidad de que al intentar acceder al recurso el servidor nos devuelva un c\u00f3digo de redirecci\u00f3n porque el recurso ha cambiado de sitio. En esta propiedad podemos <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/API\/Request\/redirect\">indicar c\u00f3mo queremos responder<\/a> ante esta posible situaci\u00f3n. Posibles valores son <strong>follow<\/strong> si queremos seguir el redireccionamiento, o <strong>error<\/strong> si queremos que la promesa sea rechazada<\/li>\n<li><strong>credentials<\/strong>: permite indicar si en la petici\u00f3n AJAX queremos <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/API\/Request\/credentials\">incluir datos de autentificaci\u00f3n, cookies, etc<\/a>.<\/li>\n<li><strong>mode<\/strong>: permite <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/API\/Request\/mode\">indicar si se consideran v\u00e1lidas peticiones a otros dominios o no<\/a>. En caso afirmativo la comunicaci\u00f3n deber\u00e1 de seguir el <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/HTTP\/CORS\">protocolo CORS<\/a> (Cross-Origin Resource Sharing). Esto tendr\u00e1 algunas implicaciones como, por ejemplo, limitaciones en el posible valor de la propiedad <strong>method<\/strong> (que solo podr\u00e1 ser HEAD, GET o POST), en el formato de los datos enviados, etc.<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<h2>\u00bfC\u00f3mo enviar los datos de un formulario HTML con la API Fetch?<\/h2>\n<p>Veamos ahora un ejemplo de c\u00f3mo ser\u00eda el envi\u00f3 de los datos de un formulario mediante fetch.<\/p>\n<p>El formulario HTML podr\u00eda ser, por ejemplo, uno como el siguiente:<\/p>\n<pre>&lt;form action=\".\/php\/contactar.php\" method=\"post\"&gt;\r\n  &lt;ul&gt;\r\n    &lt;li&gt;\r\n      &lt;label for=\"nombre\"&gt;Nombre:&lt;\/label&gt;\r\n      &lt;input type=\"text\" id=\"nombre\" name=\"nombre\" required&gt;\r\n    &lt;\/li&gt;\r\n    &lt;li&gt;\r\n      &lt;label for=\"asunto\"&gt;Asunto:&lt;\/label&gt;\r\n      &lt;input type=\"text\" id=\"asunto\" name=\"asunto\" required&gt;\r\n    &lt;\/li&gt;\r\n    &lt;li&gt;\r\n       &lt;label for=\"mensaje\"&gt;Mensaje:&lt;\/label&gt;\r\n       &lt;textarea id=\"mensaje\" name=\"mensaje\" cols=\"30\" rows=\"10\" required&gt;&lt;\/textarea&gt;\r\n    &lt;\/li&gt;\r\n    &lt;li&gt;\r\n      &lt;input type=\"checkbox\" id=\"priv\" name=\"priv\" value=\"ok\" required&gt;\r\n      &lt;label for=\"priv\"&gt;Acepto las &lt;a href=\"#\"&gt;condiciones de privacidad&lt;\/a&gt;.&lt;\/label&gt;\r\n    &lt;\/li&gt;\r\n  &lt;\/ul&gt;\r\n  &lt;div&gt;\r\n    &lt;input type=\"submit\"&gt;\r\n  &lt;\/div&gt;\r\n  &lt;div class=\"form-msg\"&gt;&lt;\/div&gt;\r\n&lt;\/form&gt;\r\n<\/pre>\n<p>Para recoger y enviar via AJAX los datos del formulario mediante Fetch, podr\u00edamos usar un c\u00f3digo como el siguiente:<\/p>\n<pre>async function enviarFormulario(ev) {\r\n  \/\/ el formulario ya no enviar\u00e1 los datos, lo haremos nosotros mediante AJAX\r\n  ev.preventDefault();\r\n  \/\/ estamos enviando ya los datos?\r\n  if (enviarFormulario.enviando) { return; }\r\n  enviarFormulario.enviando = true;\r\n  \/\/ obtenemos el formulario y la zona donde mostrar el resultado\r\n  var form = document.querySelector(\"form\");\r\n  var result = document.querySelector(\".form-msg\");\r\n  result.innerHTML = \"Enviando, por favor espera...\";\r\n  \/\/ obtenemos los datos del formulario\r\n  var datos = new FormData(form);\r\n  \/\/ podemos a\u00f1adir m\u00e1s datos que no se encuentren en el formulario\r\n  datos.append(\"otro-dato\", \"valor\");\r\n  \/\/ preramos la informaci\u00f3n de envio\r\n  var init = {\r\n    method: form.method,\r\n    body: datos\r\n  };\r\n  \/\/ petici\u00f3n ajax con fetch\r\n  try {\r\n    var response = await fetch(form.action, init);\r\n    if (response.ok) {\r\n      \/\/ obtenemos la respuesta del servidor web\r\n      \/\/ se supone que el servidor nos responder\u00e1\r\n      \/\/ si todo ha ido bien o no\r\n      var respuesta = await response.json();\r\n      \/\/ asumimos que todo ha ido bien,\r\n      \/\/ damos las gracias y limpiamos el formulario\r\n      result.innerHTML = \"Gracias por contactar con nosotros.\";\r\n      form.reset();\r\n    } else {\r\n      throw new Error(response.statusText);\r\n    }\r\n  } catch (err) {\r\n    result.innerHTML = \"Error al enviar el formulario: \" + err.message;\r\n  }\r\n  \/\/ permitimos volver a enviar el formulario de nuevo\r\n  enviarFormulario.enviando = false;\r\n}\r\n\r\ndocument.addEventListener(\"DOMContentLoaded\", function() {\r\n  document.querySelector(\"form\").addEventListener(\"submit\", enviarFormulario);\r\n});\r\n<\/pre>\n<p>Muy similar a lo que hemos visto hasta ahora, con la novedad que en este caso usamos un objeto <strong>FormData<\/strong> para obtener todos los datos del formulario. En este ejemplo, hemos asumido que el servidor nos responder\u00e1 con datos en formato JSON, pero a diferencia del ejemplo anterior, los datos que estamos enviando no se encuentran en este formato.<\/p>\n<h2>El objeto Response<\/h2>\n<p>Ya hemos visto que cuando hacemos una petici\u00f3n Fetch, existen dos promesas. La primera es la de la propia petici\u00f3n Fetch, y si esta promesa se resuelve correctamente, obtendremos <strong>un objeto de la clase Response<\/strong>. A partir de dicho objeto, solemos usar una segunda promesa para obtener el contenido de la respuesta en el formato deseado.<\/p>\n<p>Las propiedades y m\u00e9todos m\u00e1s destacables de este objeto <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/API\/Response\">Response<\/a> son:<\/p>\n<ul>\n<li><strong><em>.status<\/em><\/strong> \u2013 contiene el <a href=\"https:\/\/es.wikipedia.org\/wiki\/Anexo:C%C3%B3digos_de_estado_HTTP\">c\u00f3digo de estado HTTP<\/a> de la respuesta. Por ejemplo, 200 si todo ha ido bien, 404 si no se ha encontrado el recurso, etc.<\/li>\n<li><strong><em>.statusText<\/em><\/strong> \u2013 similar a la propiedad .status pero en este caso el c\u00f3digo es una cadena de texto (por ejemplo, para el c\u00f3digo 200 el texto es \u201cOK\u201d).<\/li>\n<li><strong><em>.ok<\/em><\/strong> \u2013 como ya hemos visto, esta propiedad valdr\u00e1 true si el servidor ha respondido con un c\u00f3digo de estado HTTP 2XX, es decir, si la petici\u00f3n AJAX ha sido resuelta satisfactoriamente.<\/li>\n<li><strong><em>.headers<\/em><\/strong> \u2013 un objeto con las cabeceras HTTP de la respuesta.<\/li>\n<li><strong><em>.redirected<\/em><\/strong> \u2013 propiedad booleana (true\/false) que nos indica si la petici\u00f3n ha sido redireccionada.<\/li>\n<li><strong><em>.url<\/em><\/strong> \u2013 indica la URL del recurso que nos ha devuelto la respuesta (que por lo general ser\u00e1 la misma URL que hemos usado para hacer la petici\u00f3n AJAX, a no ser que se hayan producido redirecciones).<\/li>\n<li><strong><em>.body<\/em><\/strong> \u2013 es un objeto que nos da acceso a la respuesta del servidor, pero <strong>normalmente usaremos alguno de los siguientes m\u00e9todos<\/strong> que ya nos proporciona el objeto Response.<\/li>\n<li><strong><em>.text()<\/em><\/strong> \u2013 tal y como ya hemos visto, este m\u00e9todo nos devuelve una promesa con el contenido de la respuesta del servidor en formato de texto plano.<\/li>\n<li><strong><em>.json()<\/em><\/strong> \u2013 de forma similar al anterior, y de nuevo tal y como ya hemos visto, este m\u00e9todo nos devuelve una promesa con el contenido en formato JSON.<\/li>\n<li><strong><em>.formData()<\/em><\/strong> \u2013 nos devuelve una promesa con el contenido en el mismo formato que se usa para enviar los datos de un formulario HTML.<\/li>\n<li><strong><em>.blob()<\/em><\/strong> \u2013 este m\u00e9todo nos devuelve una promesa con el contenido en formato binario; puede ser \u00fatil cuando el recurso que estamos pidiendo sea de tipo binario, como por ejemplo, una imagen.<\/li>\n<li><strong><em>.arrayBuffer()<\/em><\/strong> \u2013 similar al anterior, pero en este caso nos devuelve la informaci\u00f3n en forma de array.<\/li>\n<li><strong><em>.clone()<\/em><\/strong> \u2013 nos permite obtener una copia del objeto. Tan pronto consumimos la promesa asociada al objeto Response con un m\u00e9todo como .text() o .json() ya no la podemos volver a consumir, con este m\u00e9todo, si lo necesitamos, podemos hacer una copia antes de consumirla.<\/li>\n<\/ul>\n<h2>\u00bfC\u00f3mo pedir un recurso binario con la API Fetch?<\/h2>\n<p>Tal y como acabamos de ver, es posible solicitar a un servidor informaci\u00f3n en formato binario. Veamos un sencillo ejemplo de como pedir una imagen a un servidor mediante AJAX con Fetch:<\/p>\n<p>C\u00f3digo HTML:<\/p>\n<pre>&lt;img id=\"foto\" alt=\"Cargando imagen...\"&gt;\r\n<\/pre>\n<p>C\u00f3digo JavaScript:<\/p>\n<pre>(async ()=&gt;{\r\n  \/\/ hacemos la petici\u00f3n AJAX\r\n  var peticion = await fetch('img\/foto.jpg');\r\n  \/\/ resolvemos la segunda promesa\r\n  \/\/ (intentamos convertir la respuesta\r\n  \/\/ del servidor en un objeto binario)\r\n  var datos = await peticion.blob();\r\n  \/\/ mostramos la imagen en el elemento\r\n  \/\/ img que nos interese\r\n  var foto = document.querySelector(\"#foto\");\r\n  foto.src = URL.createObjectURL(datos);\r\n  foto.alt = \"Paisaje\";\r\n})();\r\n<\/pre>\n<h2>Conclusiones<\/h2>\n<p>Y con este art\u00edculo terminamos esta introducci\u00f3n al API Fetch. Nos encontramos con un API que aunque a\u00fan est\u00e1 un poco verde, esta mejor dise\u00f1ado y es m\u00e1s agradable de usar que el objeto XMLHttpRequest para realizar peticiones AJAX. Sin embargo, no hay que olvidar que el objeto XMLHttpRequest sigue siendo interesante, ya que permite hacer algunas cosas que este nuevo API no es capaz de hacer, como por ejemeplo, llevar un control del progreso de la transferencia de datos entre el navegador y el servidor Web, o la capacidad de cancelar una petici\u00f3n AJAX.<\/p>\n<p>Espero que os haya resultado un tema interesante.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>En un art\u00edculo anterior vimos el funcionamiento b\u00e1sico del API Fetch, y en que se diferencia del objeto\u00a0XMLHttpRequest (XHR). En dicho art\u00edculo nos limitamos a pedir una serie de archivos del servidor Web, concretamente archivos de tipo script. Pero AJAX tambi\u00e9n se usa para intercambiar&#8230;<\/p>\n","protected":false},"author":23,"featured_media":8742,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_ef_editorial_meta_date_first-draft-date":"","_ef_editorial_meta_paragraph_assignment":"","_ef_editorial_meta_checkbox_needs-photo":"","_ef_editorial_meta_number_word-count":"","_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[7,5],"tags":[694,253,679],"class_list":["post-8699","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-diseno-web","category-programacion","tag-fetch","tag-javascript","tag-promesas"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.1.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>\u00bfC\u00f3mo enviar y recibir datos con la API Fetch? - Blog Escola Espai<\/title>\n<meta name=\"description\" content=\"Con el API Fetch de JavaScript podemos enviar y recibir informaci\u00f3n, en formato JSON, al y desde el servidor mediante el uso de AJAX.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.espai.es\/blog\/2019\/09\/como-enviar-y-recibir-datos-con-la-api-fetch\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\u00bfC\u00f3mo enviar y recibir datos con la API Fetch? - Blog Escola Espai\" \/>\n<meta property=\"og:description\" content=\"Con el API Fetch de JavaScript podemos enviar y recibir informaci\u00f3n, en formato JSON, al y desde el servidor mediante el uso de AJAX.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.espai.es\/blog\/2019\/09\/como-enviar-y-recibir-datos-con-la-api-fetch\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog Escola Espai\" \/>\n<meta property=\"article:published_time\" content=\"2019-09-15T13:54:55+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2021-09-13T18:09:19+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.espai.es\/blog\/wp-content\/uploads\/2019\/07\/fetch2.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1000\" \/>\n\t<meta property=\"og:image:height\" content=\"500\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Abel Camarena\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Abel Camarena\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data2\" content=\"9 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.espai.es\/blog\/2019\/09\/como-enviar-y-recibir-datos-con-la-api-fetch\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.espai.es\/blog\/2019\/09\/como-enviar-y-recibir-datos-con-la-api-fetch\/\"},\"author\":{\"name\":\"Abel Camarena\",\"@id\":\"https:\/\/www.espai.es\/blog\/#\/schema\/person\/b2d40404b9d987e3586e186c021ef897\"},\"headline\":\"\u00bfC\u00f3mo enviar y recibir datos con la API Fetch?\",\"datePublished\":\"2019-09-15T13:54:55+00:00\",\"dateModified\":\"2021-09-13T18:09:19+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.espai.es\/blog\/2019\/09\/como-enviar-y-recibir-datos-con-la-api-fetch\/\"},\"wordCount\":1344,\"commentCount\":2,\"image\":{\"@id\":\"https:\/\/www.espai.es\/blog\/2019\/09\/como-enviar-y-recibir-datos-con-la-api-fetch\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.espai.es\/blog\/wp-content\/uploads\/2019\/07\/fetch2.jpg\",\"keywords\":[\"fetch\",\"javascript\",\"promesas\"],\"articleSection\":[\"Dise\u00f1o Web\",\"Programaci\u00f3n\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.espai.es\/blog\/2019\/09\/como-enviar-y-recibir-datos-con-la-api-fetch\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.espai.es\/blog\/2019\/09\/como-enviar-y-recibir-datos-con-la-api-fetch\/\",\"url\":\"https:\/\/www.espai.es\/blog\/2019\/09\/como-enviar-y-recibir-datos-con-la-api-fetch\/\",\"name\":\"\u00bfC\u00f3mo enviar y recibir datos con la API Fetch? - Blog Escola Espai\",\"isPartOf\":{\"@id\":\"https:\/\/www.espai.es\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.espai.es\/blog\/2019\/09\/como-enviar-y-recibir-datos-con-la-api-fetch\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.espai.es\/blog\/2019\/09\/como-enviar-y-recibir-datos-con-la-api-fetch\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.espai.es\/blog\/wp-content\/uploads\/2019\/07\/fetch2.jpg\",\"datePublished\":\"2019-09-15T13:54:55+00:00\",\"dateModified\":\"2021-09-13T18:09:19+00:00\",\"author\":{\"@id\":\"https:\/\/www.espai.es\/blog\/#\/schema\/person\/b2d40404b9d987e3586e186c021ef897\"},\"description\":\"Con el API Fetch de JavaScript podemos enviar y recibir informaci\u00f3n, en formato JSON, al y desde el servidor mediante el uso de AJAX.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.espai.es\/blog\/2019\/09\/como-enviar-y-recibir-datos-con-la-api-fetch\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.espai.es\/blog\/2019\/09\/como-enviar-y-recibir-datos-con-la-api-fetch\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.espai.es\/blog\/2019\/09\/como-enviar-y-recibir-datos-con-la-api-fetch\/#primaryimage\",\"url\":\"https:\/\/www.espai.es\/blog\/wp-content\/uploads\/2019\/07\/fetch2.jpg\",\"contentUrl\":\"https:\/\/www.espai.es\/blog\/wp-content\/uploads\/2019\/07\/fetch2.jpg\",\"width\":1000,\"height\":500,\"caption\":\"API Fetch\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.espai.es\/blog\/2019\/09\/como-enviar-y-recibir-datos-con-la-api-fetch\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Portada\",\"item\":\"https:\/\/www.espai.es\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\u00bfC\u00f3mo enviar y recibir datos con la API Fetch?\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.espai.es\/blog\/#website\",\"url\":\"https:\/\/www.espai.es\/blog\/\",\"name\":\"Blog Escola Espai\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.espai.es\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.espai.es\/blog\/#\/schema\/person\/b2d40404b9d987e3586e186c021ef897\",\"name\":\"Abel Camarena\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.espai.es\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/035501b0f14e120b1a49121758e2056b8d589fc43b9d3c3ad3670a197a90dddf?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/035501b0f14e120b1a49121758e2056b8d589fc43b9d3c3ad3670a197a90dddf?s=96&d=mm&r=g\",\"caption\":\"Abel Camarena\"},\"sameAs\":[\"http:\/\/www.espai.es\"],\"url\":\"https:\/\/www.espai.es\/blog\/author\/abel\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"\u00bfC\u00f3mo enviar y recibir datos con la API Fetch? - Blog Escola Espai","description":"Con el API Fetch de JavaScript podemos enviar y recibir informaci\u00f3n, en formato JSON, al y desde el servidor mediante el uso de AJAX.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.espai.es\/blog\/2019\/09\/como-enviar-y-recibir-datos-con-la-api-fetch\/","og_locale":"es_ES","og_type":"article","og_title":"\u00bfC\u00f3mo enviar y recibir datos con la API Fetch? - Blog Escola Espai","og_description":"Con el API Fetch de JavaScript podemos enviar y recibir informaci\u00f3n, en formato JSON, al y desde el servidor mediante el uso de AJAX.","og_url":"https:\/\/www.espai.es\/blog\/2019\/09\/como-enviar-y-recibir-datos-con-la-api-fetch\/","og_site_name":"Blog Escola Espai","article_published_time":"2019-09-15T13:54:55+00:00","article_modified_time":"2021-09-13T18:09:19+00:00","og_image":[{"width":1000,"height":500,"url":"https:\/\/www.espai.es\/blog\/wp-content\/uploads\/2019\/07\/fetch2.jpg","type":"image\/jpeg"}],"author":"Abel Camarena","twitter_card":"summary_large_image","twitter_misc":{"Escrito por":"Abel Camarena","Tiempo de lectura":"9 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.espai.es\/blog\/2019\/09\/como-enviar-y-recibir-datos-con-la-api-fetch\/#article","isPartOf":{"@id":"https:\/\/www.espai.es\/blog\/2019\/09\/como-enviar-y-recibir-datos-con-la-api-fetch\/"},"author":{"name":"Abel Camarena","@id":"https:\/\/www.espai.es\/blog\/#\/schema\/person\/b2d40404b9d987e3586e186c021ef897"},"headline":"\u00bfC\u00f3mo enviar y recibir datos con la API Fetch?","datePublished":"2019-09-15T13:54:55+00:00","dateModified":"2021-09-13T18:09:19+00:00","mainEntityOfPage":{"@id":"https:\/\/www.espai.es\/blog\/2019\/09\/como-enviar-y-recibir-datos-con-la-api-fetch\/"},"wordCount":1344,"commentCount":2,"image":{"@id":"https:\/\/www.espai.es\/blog\/2019\/09\/como-enviar-y-recibir-datos-con-la-api-fetch\/#primaryimage"},"thumbnailUrl":"https:\/\/www.espai.es\/blog\/wp-content\/uploads\/2019\/07\/fetch2.jpg","keywords":["fetch","javascript","promesas"],"articleSection":["Dise\u00f1o Web","Programaci\u00f3n"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.espai.es\/blog\/2019\/09\/como-enviar-y-recibir-datos-con-la-api-fetch\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.espai.es\/blog\/2019\/09\/como-enviar-y-recibir-datos-con-la-api-fetch\/","url":"https:\/\/www.espai.es\/blog\/2019\/09\/como-enviar-y-recibir-datos-con-la-api-fetch\/","name":"\u00bfC\u00f3mo enviar y recibir datos con la API Fetch? - Blog Escola Espai","isPartOf":{"@id":"https:\/\/www.espai.es\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.espai.es\/blog\/2019\/09\/como-enviar-y-recibir-datos-con-la-api-fetch\/#primaryimage"},"image":{"@id":"https:\/\/www.espai.es\/blog\/2019\/09\/como-enviar-y-recibir-datos-con-la-api-fetch\/#primaryimage"},"thumbnailUrl":"https:\/\/www.espai.es\/blog\/wp-content\/uploads\/2019\/07\/fetch2.jpg","datePublished":"2019-09-15T13:54:55+00:00","dateModified":"2021-09-13T18:09:19+00:00","author":{"@id":"https:\/\/www.espai.es\/blog\/#\/schema\/person\/b2d40404b9d987e3586e186c021ef897"},"description":"Con el API Fetch de JavaScript podemos enviar y recibir informaci\u00f3n, en formato JSON, al y desde el servidor mediante el uso de AJAX.","breadcrumb":{"@id":"https:\/\/www.espai.es\/blog\/2019\/09\/como-enviar-y-recibir-datos-con-la-api-fetch\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.espai.es\/blog\/2019\/09\/como-enviar-y-recibir-datos-con-la-api-fetch\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.espai.es\/blog\/2019\/09\/como-enviar-y-recibir-datos-con-la-api-fetch\/#primaryimage","url":"https:\/\/www.espai.es\/blog\/wp-content\/uploads\/2019\/07\/fetch2.jpg","contentUrl":"https:\/\/www.espai.es\/blog\/wp-content\/uploads\/2019\/07\/fetch2.jpg","width":1000,"height":500,"caption":"API Fetch"},{"@type":"BreadcrumbList","@id":"https:\/\/www.espai.es\/blog\/2019\/09\/como-enviar-y-recibir-datos-con-la-api-fetch\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Portada","item":"https:\/\/www.espai.es\/blog\/"},{"@type":"ListItem","position":2,"name":"\u00bfC\u00f3mo enviar y recibir datos con la API Fetch?"}]},{"@type":"WebSite","@id":"https:\/\/www.espai.es\/blog\/#website","url":"https:\/\/www.espai.es\/blog\/","name":"Blog Escola Espai","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.espai.es\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Person","@id":"https:\/\/www.espai.es\/blog\/#\/schema\/person\/b2d40404b9d987e3586e186c021ef897","name":"Abel Camarena","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.espai.es\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/035501b0f14e120b1a49121758e2056b8d589fc43b9d3c3ad3670a197a90dddf?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/035501b0f14e120b1a49121758e2056b8d589fc43b9d3c3ad3670a197a90dddf?s=96&d=mm&r=g","caption":"Abel Camarena"},"sameAs":["http:\/\/www.espai.es"],"url":"https:\/\/www.espai.es\/blog\/author\/abel\/"}]}},"jetpack_featured_media_url":"https:\/\/www.espai.es\/blog\/wp-content\/uploads\/2019\/07\/fetch2.jpg","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.espai.es\/blog\/wp-json\/wp\/v2\/posts\/8699","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.espai.es\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.espai.es\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.espai.es\/blog\/wp-json\/wp\/v2\/users\/23"}],"replies":[{"embeddable":true,"href":"https:\/\/www.espai.es\/blog\/wp-json\/wp\/v2\/comments?post=8699"}],"version-history":[{"count":21,"href":"https:\/\/www.espai.es\/blog\/wp-json\/wp\/v2\/posts\/8699\/revisions"}],"predecessor-version":[{"id":8823,"href":"https:\/\/www.espai.es\/blog\/wp-json\/wp\/v2\/posts\/8699\/revisions\/8823"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.espai.es\/blog\/wp-json\/wp\/v2\/media\/8742"}],"wp:attachment":[{"href":"https:\/\/www.espai.es\/blog\/wp-json\/wp\/v2\/media?parent=8699"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.espai.es\/blog\/wp-json\/wp\/v2\/categories?post=8699"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.espai.es\/blog\/wp-json\/wp\/v2\/tags?post=8699"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}