Estoy escribiendo una aplicación de servidor para proporcionar un Rest-API. Si el servidor obtiene un GET sin encabezado de tipo de contenido JSON, sirve una página html vacía que tiene un módulo javascript en su encabezado . Este código de javascript usa fetch para consumir Rest-API y luego lo completa de acuerdo con el cuerpo del documento con el contenido obtenido del servidor. Cada "enlace" en el contenido desencadena más llamadas a la API y las actualizaciones correspondientes al contenido.
Hasta aquí todo bien. Pero hice dos observaciones irritantes.
(obviamente) los botones "atrás" y "adelante" del navegador permanecen inactivos. Lo que parece lógico ya que no hay URL cargadas asociadas con los cambios de contenido.
Si llego a mi Rest-UI desde otra página y presiono el botón de retroceso del navegador, como se esperaba, obtengo la otra página de regreso, pero si presiono ahora el botón de avance del navegador, veo la respuesta JSON de mi búsqueda inicial en lugar de mi Resto-UI contenido. Recargar mi página hace que todo vuelva a estar bien, pero no puedo ofrecer ese comportamiento a ningún usuario :)
¿Existen enfoques comunes para tratar este comportamiento? Por ejemplo, eliminando los controles del navegador por completo, alimentando el historial del navegador "a mano" con js-callbacks, directivas de almacenamiento en caché, ... (No tengo experiencia con js)
La raíz del problema es que sobrecargué la respuesta de una solicitud GET en el lado del servidor: si la solicitud GET acepta JSON, el servidor devuelve JSON; de lo contrario, devuelve una página html con javascript que consume JSON. Es decir. la búsqueda de javascript para el JSON es la última respuesta GET para una URL dada y va como tal a la memoria caché del navegador asociada con esa URL. Una solución a ese problema que funciona para mí es enviar un encabezado con la respuesta JSON desactivando el almacenamiento en caché y señalando al navegador con el encabezado "Variar" que la respuesta depende del encabezado "Aceptar". Otra solución podría ser agregar puntos finales distintos al servidor para las solicitudes de descanso.