forked from UOC-Escola-de-Programacio/python-c1-tema1
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathej1b2.py
More file actions
135 lines (113 loc) · 4.73 KB
/
Copy pathej1b2.py
File metadata and controls
135 lines (113 loc) · 4.73 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
"""
Enunciado:
Manejo avanzado de errores HTTP con la biblioteca requests de Python.
En este ejercicio, aprenderás a:
1. Realizar peticiones a diferentes URLs que generarán distintos códigos de estado HTTP
2. Diferenciar entre varios tipos de errores HTTP (4xx, 5xx)
3. Manejar redirecciones (códigos 3xx)
4. Extraer información detallada de las respuestas de error
5. Procesar respuestas JSON con información específica sobre el estado
Tu tarea es completar la función request_with_error_handling para manejar adecuadamente
diferentes tipos de respuestas HTTP, incluyendo errores cliente (4xx), errores servidor (5xx)
y redirecciones (3xx).
Nota: El servidor httpstatuses.maor.io devuelve respuestas JSON con la siguiente estructura:
{
"code": 404,
"description": "Not Found"
}
Deberás comprobar que el código en el encabezado HTTP coincide con el campo "code"
en el cuerpo JSON y usar el campo "description" para proporcionar información detallada.
"""
import requests
def request_with_error_handling(url):
"""
Realiza una petición GET a la URL proporcionada y maneja los diferentes tipos de
respuestas HTTP que puedan ocurrir.
Args:
url (str): La URL a la que se realizará la petición
Returns:
dict: Un diccionario con la siguiente información:
- success (bool): True si la petición fue exitosa (código 2xx), False en otro caso
- status_code (int): El código de estado HTTP
- is_redirect (bool): True si la respuesta es una redirección (código 3xx)
- redirect_url (str, opcional): URL de redirección si is_redirect es True
- error_type (str, opcional): "client_error" para 4xx, "server_error" para 5xx
- message (str): Un mensaje descriptivo sobre el resultado de la petición
"""
try:
response = requests.get(url, allow_redirects=False)
status_code = response.status_code
# Intentar obtener la descripción del JSON si está disponible
try:
json_data = response.json()
description = json_data.get("description", "")
except Exception:
description = ""
# Respuestas exitosas (2xx)
if 200 <= status_code < 300:
return {
"success": True,
"status_code": status_code,
"is_redirect": False,
"message": description or "Request successful",
}
# Redirecciones (3xx)
elif 300 <= status_code < 400:
redirect_url = response.headers.get("Location", "")
return {
"success": False,
"status_code": status_code,
"is_redirect": True,
"redirect_url": redirect_url,
"message": description or "Redirect",
}
# Errores del cliente (4xx)
elif 400 <= status_code < 500:
return {
"success": False,
"status_code": status_code,
"is_redirect": False,
"error_type": "client_error",
"message": description or "Client error",
}
# Errores del servidor (5xx)
elif 500 <= status_code < 600:
return {
"success": False,
"status_code": status_code,
"is_redirect": False,
"error_type": "server_error",
"message": description or "Server error",
}
except requests.exceptions.ConnectionError as e:
return {
"success": False,
"status_code": None,
"is_redirect": False,
"message": f"connection_error: {str(e)}",
}
except Exception as e:
return {
"success": False,
"status_code": None,
"is_redirect": False,
"message": f"Error: {str(e)}",
}
if __name__ == "__main__":
# Puedes probar tu función con estas URLs:
# Para probar un error 404 (Not Found)
print("Probando URL con error 404:")
result = request_with_error_handling("https://httpstatuses.maor.io/404")
print(f"Resultado: {result}")
# Para probar un error 500 (Server Error)
print("\nProbando URL con error 500:")
result = request_with_error_handling("https://httpstatuses.maor.io/500")
print(f"Resultado: {result}")
# Para probar una redirección 301 (Moved Permanently)
print("\nProbando URL con redirección 301:")
result = request_with_error_handling("https://httpstatuses.maor.io/301")
print(f"Resultado: {result}")
# Para probar una respuesta exitosa
print("\nProbando URL con respuesta exitosa:")
result = request_with_error_handling("https://httpstatuses.maor.io/200")
print(f"Resultado: {result}")