Tengo un formulario en https://example.com/order/ que quiero validar del lado del servidor después de enviarlo. Si es válido, quiero que el navegador navegue a https://example.com/summary/ . Si no es válido, quiero devolver un mensaje de error y permanecer en la misma página.
Sé cómo hacerlo en dos solicitudes (por ejemplo, devolver una redirección HTTP 302 en lugar de HTTP 200 con el contenido de la página), pero quiero hacerlo con una sola solicitud porque dos parecen demasiado para una tarea tan simple.
Durante mi investigación he encontrado dos posibles soluciones, ambas terriblemente malas:
Uso de JavaScript para enviar el formulario y manejar las respuestas. Si la respuesta es HTTP 400, maneje la visualización del error. Si la respuesta es HTTP 200, reemplace todo el documento HTML con el cuerpo de la respuesta, actualice la dirección de la página y el historial del navegador.
No me gusta esta solución porque parece demasiado complicada para una tarea tan simple y no estoy seguro de si es posible eliminar los scripts que ya se han cargado y se están ejecutando. Imagine tener algo como <script>setInterval(() => {console.log("side-effect")}, 1000);</script> en el código HTML, seguirá ejecutándose incluso después de que yo haga document.open(); document.write(response); document.close(); .
Configure la acción del formulario para publicar directamente en /summary/ . Si el formulario es válido, devuelva HTTP 200 con el contenido de la página y la página se cargará correctamente. Si el formulario no es válido, devuelva un HTTP 204 Sin contenido; esto hará que el navegador permanezca en la misma página. Luego puedo incluir los detalles del error en una cookie o algún otro encabezado de respuesta (HTTP 204 no permite que una respuesta contenga cuerpo).
Este lo odio aún más porque violaría muchas reglas detrás de la comunicación HTTP cliente-servidor con el uso indebido del estado HTTP 204. Sería genial si hubiera un estado de respuesta de error HTTP similar que le indicara al navegador que permaneciera en la misma página y permitiera un cuerpo de respuesta.
Entonces, ¿hay alguna manera de hacerlo con una sola solicitud sin dejar de cumplir con los estándares y sin efectos secundarios?
No, la compatibilidad del navegador con 204 apesta (simplemente aparece una pantalla en blanco), y no hay forma de notificar al usuario qué salió mal. 204 ni siquiera es apropiado para su caso, porque desea usarlo en caso de error, pero 204 es un estado de éxito.
En los viejos tiempos, solo mostrábamos un error de pantalla completa en la página de resultados y le pedíamos al usuario que presione el botón Atrás. El navegador retiene los valores del formulario para que puedan corregir su error sin perder el formulario completo.
Sin embargo, hacer 2 solicitudes es una buena idea en la mayoría de los casos, desea enviar los datos al servidor y luego redirigir a una nueva página después de obtener un código de estado 303 . Si no lo hace, los usuarios volverán a enviar el formulario si presionan el botón Atrás, lo que casi nunca es deseable.