Request y Response en PHP: Entendiendo la Comunicación entre el Cliente y el Servidor
Cuando nos iniciamos en el mundo del desarrollo web (ahora también mal llamado “aplicaciones web”), nos encontramos con dos conceptos o términos que son fundamentales entenderlos desde un principio, pues en ellos se basa toda comunicación entre “nuestra web” y “el cliente”.
Estos dos conceptos fundamentales son Request (solicitud) y Response (respuesta).
Este articulo pretende hablar sobre Request y Response vistos desde la programación web con PHP, pero no importa, ya que son conceptos generales. Como dije al principio, en ellos se basa toda comunicación 😉
¿Qué es un Request?
Request es la solicitud que realiza el cliente (entendiendo por cliente el navegador web) a un servidor. Esta solicitud representa todo un conjunto de datos que el navegador envía al servidor para comunicarse con él, solicitándole por ejemplo un recurso, una página, una imagen, etc.
Esta solicitud puede hacerse de varias formas. Por ejemplo, al ingresar una URL, enviar un formulario o hacer clic en un enlace entre otros, ya estamos realizando una solicitud.
Cuando accedemos a una web, le estamos solicitando al servidor un recurso, en este caso una página, pero, inconscientemente a la misma vez, también le estamos “dando” información útil como:
- Método HTTP usado: GET, POST, PUT, DELETE.
- Cabeceras (Headers): contiene metadatos como User-Agent, Content-Type, Accept y otros.
- Si hemos realizado el envío de un formulario, le enviamos los campos de este.
- Cookies
- La URL
- Archivo solicitado
- Dirección IP
¿Qué es Response?
Response es la respuesta (qué obvio no?) que devuelve el servidor al cliente después de haber procesado su solicitud.
Esta respuesta puede ser en formato HTML, JSON… pero también puede darte una respuesta en modo de redirección, y muy importante también, en cada respuesta hay lo que se llama un código de estado HTTP para indicar si todo ha salido según lo esperado, si ha habido un error o sencillamente si el recurso no se ha encontrado entre otros tipos.
Estos códigos son los típicos 404 Not Found, 500 Internal Server Error, etc.
¡Eso es todo! 🙄
¿Y ya está?
Sí, ya está, ¡no hay más!
Bueno siiiiiiiiii, esa es la teoría o el significado de cada concepto, pero ahora veamos un poco más de cada uno, eso sí, como dije también antes, desde el ámbito de PHP.
Request en PHP
En PHP, cuando realizamos una solicitud a un servidor para acceder a un determinado recurso, por ejemplo, una página o yo que se, cualquier otro recurso, podemos ver también los datos que se envían con nuestra solicitud. Para ello disponemos de $_SERVER, que es una variable superglobal que contiene todos los datos que se envían con la petición/solicitud.
PHP accede a varios datos enviados por el cliente a través de la superglobal $_SERVER, pero no a todo lo que se transmite.
Algunos ejemplos típicos:
- $_SERVER[‘REQUEST_METHOD’]: Método usado: GET, POST, etc.
- $_SERVER[‘REQUEST_URI’]: URI solicitada (ej: /img/logo.png)
- $_SERVER[‘HTTP_USER_AGENT’]: Navegador del cliente
- $_SERVER[‘HTTP_ACCEPT’]: Tipos de contenido aceptados por el cliente
- $_SERVER[‘REMOTE_ADDR’]: Dirección IP del cliente
- $_SERVER[‘QUERY_STRING’]: La parte de la URL después del ?
Puedes ver más y toda la info de $_SERVER aquí
Un ejemplo con código es el siguiente:
<?php // Obtener el método de la solicitud $method = $_SERVER['REQUEST_METHOD']; // Obtener los datos enviados por GET $nombre = $_GET['nombre'] ?? ''; // Obtener los datos enviados por POST $email = $_POST['email'] ?? ''; // Obtener la URI solicitada $uri = $_SERVER['REQUEST_URI']; // Obtener la cadena de consulta (query string) $queryString = $_SERVER['QUERY_STRING'] ?? ''; // Obtener el User-Agent $userAgent = $_SERVER['HTTP_USER_AGENT']; // Obtener la dirección IP del cliente $ip = $_SERVER['REMOTE_ADDR'] ?? ''; echo "<pre>"; echo "method: $method\n"; echo "nombre: $nombre\n"; echo "email: $email\n"; echo "uri: $uri\n"; echo "queryString: $queryString\n"; echo "userAgent: $userAgent\n"; echo "ip: $ip\n"; echo "</pre>";
Si ese código lo guardamos como ejemplo1.php y luego lo ejecutaramos escribiendo por ejemplo: http://localhost/ejemplo1.php?nombre=pepito
El resultado por pantalla será el siguiente:
method: GET
nombre: pepito
email:
uri: request.php?nombre=pepito
queryString: nombre=pepito
userAgent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36
ip: 127.0.0.1
Como vemos, aparte de a información que le podemos enviar nosotros a través de GET o POST, nos muestra información que por norma general no vemos, como nuestra IP o datos del navegador (cliente) usado.
Response en PHP
Como sabemos ya, response es la respuesta del servidor a la solicitud del cliente.
Para ver varios tipos de información que ofrece el servidor a la solicitud del cliente, PHP dispone de varios métodos. Pero eso sí, debemos de tener en cuenta que PHP no tiene una superglobal tipo $_RESPONSE porque la respuesta no se “recibe”, sino que se construye en base a la petición del cliente. ¿Lo pillas? 😜
Dicho esto, hay varios métodos para ver, controlar y modificar la respuesta.
Por ejemplo, podemos hacer simplemente así:
<?php $url = 'http://www.google.es'; echo "<pre>"; print_r(get_headers($url)); print_r(get_headers($url, true)); echo "</pre>";
Que como indica la documentación oficial de get_headers():
“Devuelve todos los encabezados enviados por el servidor en respuesta a una petición HTTP”.
Podemos usar header(), que nos permite modificar las cabeceras HTTP que el servidor enviará al cliente.
header("Content-Type: application/json"); header("Location: otra_pagina.php");
También podemos usar http_response_code() para establecer nosotros mismos el código de estado HTTP de la respuesta, como 200 OK, 404 Not Found, 500 Internal Server Error, etc.
http_response_code(404);
O bien setcookie(), que se encarga de enviar una cabecera especial Set-Cookie para almacenar cookies en el cliente.
Podemos usar también las cabeceras para forzar descargas de archivos, por ejemplo, si no queremos que se muestre un archivo (por ejemplo, un PDF) sino que se descargue automáticamente, podemos hacer:
header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename="archivo.pdf"'); readfile('archivo.pdf');
¡Y eso sería todo! Hasta aquí el articulo o minipost. Una vez más espero que te haya servido y resultado útil. Recuerda que entender estos dos conceptos desde un principio es fundamental para crear aplicaciones web dinámicas y robustas.
Sobre el autor
Este artículo está publicado bajo una licencia Creative Commons Atribución-CompartirIgual 4.0 Internacional . Puedes compartirlo y adaptarlo, incluso con fines comerciales, siempre que cites al autor y mantengas esta misma licencia.