0% encontró este documento útil (0 votos)
20 vistas16 páginas

Practica HTTP

Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
20 vistas16 páginas

Practica HTTP

Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd

Redes e Internet

1º Grado en Ingeniería de Datos en Procesos Industriales


Curso 2024/2025

Memoria de prácticas Página: 1

PRACTICA: 1 - HTTP

ALUMNO: Alan Paul Carvajal Gualavisi FECHA: 16/03/2025

Objetivos y resultados

El objetivo de esta práctica es que el alumno se inicie en el uso de sockets en Python adquiriendo las
siguiente destrezas o conocimientos.

 Descubrir la interfaz de sockets del sistema operativo.

 Conocer librerías de alto nivel para la realización de peticiones HTTP, manejar contenidos
JSON, sockets y otras estructuras.

 Acostumbrarse a localizar la información necesaria en documentación oficial.

 Ser capaz de establecer una conexión TCP contra un servidor de internet e implementar una
llamada HTTP a bajo nivel y recibir el resultado y contenido de la operación.

 Iniciarse en el uso de interfaces REST, recabar datos de internet en tiempo real y construir
conjuntos de datos para posterior análisis.

Ejercicio 1
Análisis del protocolo HTTP con herramientas de desarrollador

Pregunta 1: Accede desde el navegador a la url


http://eupla.es/redes/usuarios.php . Abre las herramientas de
navegador, muévete a la ventana de “red” y análisis de tiempo.
Incluye un pantallazo de la pantalla donde detalle los tiempos
consumidos en la operación. Indica donde se consume la mayoría del
tiempo que ha tardado.
La página encontrada fue:
Redes e Internet
1º Grado en Ingeniería de Datos en Procesos Industriales
Curso 2024/2025

Memoria de prácticas Página: 2

Después de buscar en el navegador la url, hubo dos procesos GET el de hacer conexión con la pagina y
el de búsqueda del icono para la ventana, el de documento fue el único de ambos en dar código 200.

Por eso si tienen tiempos los cuales son los siguientes:

Hubo tres tiempos con consumo, los cuales son: bloqueo, conexión y espera, el tiempo con mas
consumo fue el de espera con un consumo de 25ms de los 41ms que llevo toda la operación, un 61%
de la operación.
Redes e Internet
1º Grado en Ingeniería de Datos en Procesos Industriales
Curso 2024/2025

Memoria de prácticas Página: 3

Pregunta 2: Muévete a la ventana de red y encabezados. Incluye una


pantalla donde se vean todas las cabeceras enviadas y recibidas.
Fíjate en su sintaxis.
Estas fueron las cabeceras de GET:

Sin codificar son así:


Redes e Internet
1º Grado en Ingeniería de Datos en Procesos Industriales
Curso 2024/2025

Memoria de prácticas Página: 4

El script ocupado en el segundo es el mismo que el de las transparencias del tema 2.

Pregunta 3: Incluye en la url un parámetro. El nombre de la variable


será “nia” y el valor corresponderá con número de nia. Vuelve a
mostrar las cabeceras en la ventana de red/cabeceras y localiza
aquella que establezca una cookie.
Agregre “?nia=933496” para poder identificarme y retorno esto:

Al ver en la cabecera response se encuentra la cookie (Set-Cookie), que ayuda a que la página nos
identifique.
Redes e Internet
1º Grado en Ingeniería de Datos en Procesos Industriales
Curso 2024/2025

Memoria de prácticas Página: 5

Pregunta 4: La cookie recibida, la enviará automáticamente el


navegador en las cabeceras de solitud, vuelve a realizar un acceso a
http://eupla.es/redes/usuarios.php y compruébalo. Fíjate en su
sintaxis.
Al acceder al url aparece esto, se pude ver que guarda la cookie del primer url. Agrega la url en la
cabecera request.

Ejercicio 2
Crear un programa en python que implemente el protocolo básico HTTP para recoger una página de
internet.

Pregunta 1: Decide los valores adecuados para “port”, los parámetros


de socket(…) y connect(…), razona la respuesta, e introdúcelos al
programa
Para por ocupe el puerto numero 80 por que es el más utilizado para solicitar servicios web; en socket
definí a la familia de protocolos AF_INET por ser la más ocupada en IPv4 y a al tipo como
SOCK_STREAM por que es un protocolo orientado a conexión; en connect agregue el socket que quería
conectar y su puerto, hostname y puerto 80 respectivamente.
Redes e Internet
1º Grado en Ingeniería de Datos en Procesos Industriales
Curso 2024/2025

Memoria de prácticas Página: 6

Pregunta 2: Construye una petición HTTP 1.0 conforme al estándar


RFC2616 y cuyo resumen se encuentra en las transparencias de la
asignatura. Se sugiere que se use la instrucción GET con las
cabeceras Host y User-Agent como mínimo. Establece una conexión
no persistente. Explica como la construyes. Consulta las diapositivas
de clase para más información. Asegúrate de usar HTTP 1.0.
Defino en GET la web a la que quiero acceder “/redes/practica1.php”, el host es el servidor al que
quiero acceder en este caso es www.eupla.es, user-agent es el navegador y la versión que ocupare
para la petición; Connection agrego “close” por que en este caso es conexión no persistente. Retorna
lo de la segunda imagen.

Pregunta 3: Envía la petición HTTP al servidor eupla.es y obtén la


respuesta. Muestra cual es el texto enviado y cuál es el texto
recibido. Divide el contenido devuelto por el servidor en cabeceras y
cuerpo. Estudia el protocolo a ver qué es lo que separa uno de otro y
aprovéchate de la función split() pero recuerda: la red habla en bytes,
el separador tiene que darse en bytes.
El texto enviado y recibido están en la segunda imagen del ejercicio anterior.
Redes e Internet
1º Grado en Ingeniería de Datos en Procesos Industriales
Curso 2024/2025

Memoria de prácticas Página: 7

Para poder recibir la respuesta del servidor de manera distinta y mas organizada hago lo siguiente,
divido la cabecera y cuerpo mediante la función Split() con los argumentos “\r\n\r\n” y 1, que son los
que van a ayudar a que después de separarlos mensajes recibidos, los envíe al grupo de cabecera o de
cuerpo, imprimo la petición que hago al servidor (send_buf), imprimo las cabeceras decodificándola
para poder pasarla de bytes a texto, los mismo con el cuerpo y agregue unos separadores y un salo de
línea para diferenciar mejor cuerpo de cabeceras.

Pregunta 4: Prueba y comenta qué sucede si no se incluye la cabecera


Host. Prueba y comenta qué sucede si no se incluye la cabecera User-
Agent.
Al quitar la cabecera host nos salta el código 404 de pagina no encontrada y lo agrega en el cuerpo.
Redes e Internet
1º Grado en Ingeniería de Datos en Procesos Industriales
Curso 2024/2025

Memoria de prácticas Página: 8

Al retirar la cabecera user-agent, el servidor deniega la solicitud efectuada y en el cuerpo nos retorna
que no tenemos acceso a ese recurso.

Pregunta 5: Observa que si accedes desde el navegador web a


http://eupla.es/redes/practica1.php, sabe quién eres sin necesidad de
introducir ningún parámetro en la url. ¿Cómo sabe quién eres? ¿Por
qué si te encuentras en el mismo ordenador, pero realizas la petición
desde python, ya no sabe quién eres? Haz que sepa quién eres desde
python sin introducir tu nia en la url
Al acceder a la url desde el navegador me reconoce mediante la cookie agregada en el primer enlace
del ejercicio 1 donde le agregue en el url mi nia. Pero al hacerlo desde python como se vio en las
preguntas anteriores nos retorna como usuario desconocido, porque al no estar desde el navegador la
cookie no es agregada a la petición que hacemos en python.
Redes e Internet
1º Grado en Ingeniería de Datos en Procesos Industriales
Curso 2024/2025

Memoria de prácticas Página: 9

Esto se resuelve agregando un parámetro en las cabeceras, la cabecera cookie(Cookie: redes=933496)


que también la podeos encontrar al inspeccionar en la página de la url, que ayuda a que el servidor nos
reconozca como un usuario de redes, agregando mi nombre en el mensaje de respuesta del servidor.
Redes e Internet
1º Grado en Ingeniería de Datos en Procesos Industriales
Curso 2024/2025

Memoria de prácticas Página: 10

Pregunta 6: Cuando hablamos de contenido estático, por ejemplo:


http://eupla.es/redes/logoredes.jpg se incluye una cabecera en la
respuesta que indica su fecha de modificación. Solicita esta URL
desde python y observa cuál es su fecha de modificación.
Posteriormente vuelve a hacer una petición introduciendo una
cabecera If-Modified-Since, indicando la fecha devuelta por la anterior
petición en el mismo formato. ¿Que devuelve ahora? ¿Por qué es esto
útil?
Al solicitar la url desde python, retorna las cabeceras, pero en el cuerpo salta error, en las cabeceras
viene escrita la fecha de modificación que utilizare en la cabecera que me da el enunciado.

Agrego la cabecera If-Modified-Since, con la fecha de modificación recibida por el servidor, en


cabeceras agrega el mensaje 304 que el objeto no ha sido modificado por lo tanto no lo devuelve en el
cuerpo.

Esto es útil para cuando el cliente solicita un objeto y si no esta modificado le devuelve la copia del
objeto, sin necesidad de descargarlo de nuevo, ahorrando un RTT en el proceso.
Redes e Internet
1º Grado en Ingeniería de Datos en Procesos Industriales
Curso 2024/2025

Memoria de prácticas Página: 11

Código fuente archivo en python


import socket;
# el recurso que quiero separado en dominio y objeto
name = "www.eupla.es"
url = "http://eupla.es/redes/logoredes.jpg"
port = 80
# convierto nombre a IP
host = socket.gethostbyname(name);
# construyo la petion en base al estandard HTTP 1.0
# rellenar aqui el valor de la request
send_buf="GET /redes/logoredes.jpg HTTP/1.0\r\n\
Host:www.eupla.es\r\n\
User-Agent: Firefox/3.6.10\r\n\
Connection: close\r\n\
If-Modified-Since: Thu, 13 Feb 2025 10:51:34 GMT\r\n\
\r\n"
# Creo un socket. elige la familia y el tipo
s=socket.socket(socket.AF_INET , socket.SOCK_STREAM );
# Esteblece un tiempo de espera maximo de un segundo para conectar
s.settimeout(2)
# Conecto con el punto remoto
s.connect((host, 80));
# Le envio la request HTTP
s.send(send_buf.encode());
# recogo los datos en bucle hasta que se acaben
data=b"";
part=None;
while( True ):
part = s.recv(256)
data += part
# realmente no hay manera de saber cuando se acaban los datos
Redes e Internet
1º Grado en Ingeniería de Datos en Procesos Industriales
Curso 2024/2025

Memoria de prácticas Página: 12

# cuando el otro extremo cierra la conexion devuelve cero bytes


if (part==b''):
break;
# cierro el socket
s.close();
# imprimo los datos
print(data)
# Dividir los datos en cabecera y cuerpo e imprimir todo
cabecera, cuerpo= data.split(b"\r\n\r\n",1)
# TODO
print("\nENVIADO------")
print(send_buf)
print("CABECERAS RECIBIDAS-----")
print(cabecera.decode())
print("\nCUERPO RECIBIDO-----")
print(cuerpo.decode())

Ejercicio 3
Crear un programa en python que implemente llamadas a un servicio REST

Pregunta 1: ¿Cuál es la URL del servicio de bicis que ofrece un listado


de todas las estaciones?
Url que da un listado de todas las estaciones:

https://www.zaragoza.es/sede/servicio/urbanismo-infraestructuras/estacion-bicicleta.json

Pregunta 2: Introduce en el navegar la url y muestra un fragmento de


los resultados sin procesar.
Después de agregar la url en el navegador sale lo siguiente:

Foto datos procesados


Redes e Internet
1º Grado en Ingeniería de Datos en Procesos Industriales
Curso 2024/2025

Memoria de prácticas Página: 13

Pregunta 3: Crea un programa que acceda a la URL para obtener el


objeto JSON. Con la librería request es muy sencillo. Puedes basarte
en el ejemplo del estudio previo.
1. Programa para url obtener el objeto JSON de la url

Pregunta 4: Realiza la petición del objeto y muestra el status code y la


cabecera que indica que el objeto devuelto es de tipo json. ¿Qué
cabecera es esa?
El status-code es 200 significa que funcionó correctamente y la cabecera que confirma que la petición
es tipo JSON es “content-type”

Pregunta 5: Convierte el resultado a un diccionario de Python.


Observa el diccionario con el explorador de variables. Muestras los
primeros elementos y analiza que información te ofrece y cómo está
estructurada.
Código para hacerlo diccionario:
Redes e Internet
1º Grado en Ingeniería de Datos en Procesos Industriales
Curso 2024/2025

Memoria de prácticas Página: 14

Después desde el administrador de variables podemos ver que reconoce los datos como un diccionario
con cuatro parámetros(results, rows, star, totalCount), del cual results es el que lleva todas las
estaciones recibidas por la URL

Pregunta 6: ¿Cuantas estaciones ha devuelto la petición? Asegúrate


que están todas. Tal vez tengas que enviar parámetros y repetir para
seleccionar la cantidad que quieras. ¿Qué tendrías que hacer para
recibir solo 10 estaciones?
Para ver cuantas estaciones recibimos agregamos código que defina cuantas estaciones recibimos:
Redes e Internet
1º Grado en Ingeniería de Datos en Procesos Industriales
Curso 2024/2025

Memoria de prácticas Página: 15

Despues para recibir solo 10 estaciones me apoyo de la funcion params que permite designar cuantos
elementos se reciben como limite, rows en el diccioario data el la cantidad que permite de elemntos
que recibimos y lo asignamos en 10 paa solo recicbir 10 estaciones:

Visto desde el explorador de variable se pueden ver los 10 elementos permitidos:

Código fuente archivo en python


import requests
parametro = {'rows':10}
url = "https://www.zaragoza.es/sede/servicio/urbanismo-infraestructuras/estacion-bicicleta.json"
Redes e Internet
1º Grado en Ingeniería de Datos en Procesos Industriales
Curso 2024/2025

Memoria de prácticas Página: 16

r = requests.get(url, params=parametro)
data = r.json()
print(data)
print("Codigo", r.status_code)
print('Cabeceras:', r.headers)
print('\nCuerpo:', r.text)
estaciones = data['result']
cantidad_estaciones = len(estaciones)
print(f"Se han recibido {cantidad_estaciones} estaciones.")

También podría gustarte