php - Entendiendo “post/redirect/get”
html forms (3)
Me está costando mucho entender el proceso exacto de "publicar / redirigir / obtener". He revisado este sitio y la web durante varias horas y no puedo encontrar nada más que "aquí está el concepto". ¿Es tan simple que no requiere tutorial paso a paso? ¿Alguien sabe de un buen sitio web o libro que pueda usar para encontrar un ejemplo o tutorial?
Intentaré explicarlo. Tal vez la perspectiva diferente haga el truco por ti.
Con PRG el navegador termina haciendo dos peticiones. La primera solicitud es una solicitud POST y generalmente se usa para modificar datos. El servidor responde con un encabezado de ubicación en la respuesta y no con HTML en el cuerpo. Esto hace que el navegador sea redirigido a una nueva URL. Luego, el navegador realiza una solicitud GET a la nueva URL que responde con el contenido HTML que el navegador procesa.
Trataré de explicar por qué se debe usar PRG. El método GET nunca debe modificar los datos. Cuando un usuario hace clic en un enlace, el navegador o el servidor proxy puede devolver una respuesta en caché y no enviar la solicitud al servidor; esto significa que los datos no se modificaron cuando deseaba que se modifiquen. Además, una solicitud POST no debe usarse para devolver datos porque, si el usuario solo desea obtener una copia nueva de los datos, debe volver a ejecutar la solicitud, lo que hará que el servidor modifique los datos nuevamente. Por esta razón, el navegador le dará ese vago cuadro de diálogo que le preguntará si está seguro de que desea reenviar la solicitud y posiblemente modificar los datos por segunda vez o enviar un correo electrónico por segunda vez.
PRG es una combinación de POST y GET que utiliza cada uno para lo que están destinados a ser utilizados.
Como puede saber de su research , POST
redirigir- GET
tiene este aspecto:
- El cliente obtiene una página con un formulario.
- El formulario
POST
s al servidor. - El servidor realiza la acción y, a continuación, redirige a otra página.
- El cliente sigue la redirección.
Por ejemplo, digamos que tenemos esta estructura del sitio web:
-
/posts
(muestra una lista de posts y un enlace a "agregar post")-
/<id>
(ver una publicación en particular) -
/create
(si se solicita con el métodoGET
, devuelve un formulario que se publica a sí mismo; si es una solicitudPOST
, crea la publicación y redirige al punto final/<id>
)
-
/posts
sí mismas no son realmente relevantes para este patrón en particular, así que las omitiré.
/posts/<id>
podrían implementarse de esta manera:
- Encuentra la publicación con ese ID en la base de datos.
- Renderiza una plantilla con el contenido de esa publicación.
/posts/create
podría implementarse así:
- Si la solicitud es una solicitud
GET
:- Muestre un formulario vacío con el objetivo establecido en sí mismo y el método establecido en
POST
.
- Muestre un formulario vacío con el objetivo establecido en sí mismo y el método establecido en
- Si la solicitud es una solicitud
POST
:- Validar los campos.
- Si hay campos no válidos, vuelva a mostrar el formulario con los errores indicados.
- De lo contrario, si todos los campos son válidos:
- Agrega la publicación a la base de datos.
- Redirigir a
/posts/<id>
(donde<id>
se devuelve de la llamada a la base de datos)