Swift encode URL: 5 errores fatales y cómo evitarlos

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Cómo codificar URL en Swift: por qué tu código falla con cirílico y espacios



Cada desarrollador que ha enviado una solicitud de red en Swift ha enfrentado este problema: formas una URL, agregas parámetros y el servidor devuelve un error 400 o, peor aún, ignora silenciosamente la solicitud. ¿Te suena familiar? La mayoría de las veces, el problema radica en una codificación incorrecta de la URL. Parece bastante simple: tomar una cadena, reemplazar espacios con %20 y listo. Pero Swift (como cualquier lenguaje estricto) no tolera el trabajo descuidado.



En este artículo, analizaremos los 5 errores más comunes al hacer Swift encode URL, que acumulan miles de vistas en Stack Overflow. Aprenderás cómo evitarlos y escribir código confiable que funcione con cualquier dato, desde letras en inglés hasta cirílico complejo y caracteres especiales.



Error #1: Usar addingPercentEncoding con el conjunto de caracteres incorrecto



Este es quizás el error más popular. Muchos principiantes ven el método addingPercentEncoding(withAllowedCharacters:) y piensan: "¡Oh, perfecto!". Pero pasan .urlHostAllowed o .urlPathAllowed para toda la URL. El resultado: un bloqueo o una solicitud incorrecta.



¿Por qué no funciona esto?



Cada parte de la URL (esquema, host, ruta, parámetros de consulta) tiene su propio conjunto de caracteres permitidos. Si codificas toda la URL como un host, perderás las barras y los dos puntos. Si la codificas como una ruta, romperás la cadena de consulta.



// ❌ Error: codificar toda la URL como un hostlet urlString = "https://example.com/path?name=Ivan & surname=Petrov"let encoded = urlString.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed)// Resultado: "https%3A%2F%2Fexample.com%2F%D0%BF%D1%83%D1%82%D1%8C%3Fname%3D%D0%98%D0%B2%D0%B0%D0%BD%20%26%20%D1%84%D0%B0%D0%BC%D0%B8%D0%BB%D0%B8%D1%8F%3D%D0%9F%D0%B5%D1%82%D1%80%D0%BE%D0%B2"// El servidor no entenderá esa URL


Recuerda la regla de oro: codifica cada parte de la URL por separado o usa URLComponents.



El enfoque correcto: URLComponents



// ✅ Correcto: usar URLComponentsvar components = URLComponents()components.scheme = "https"components.host = "example.com"components.path = "/path"components.queryItems = [    URLQueryItem(name: "name", value: "Ivan & Petrov"),    URLQueryItem(name: "surname", value: "Ivanov")]

if let url = components.url { print(url.absoluteString) // "https://example.com/%D0%BF%D1%83%D1%82%D1%8C?name=%D0%98%D0%B2%D0%B0%D0%BD%20%26%20%D0%9F%D0%B5%D1%82%D1%80%D0%BE%D0%B2&%D1%84%D0%B0%D0%BC%D0%B8%D0%BB%D0%B8%D1%8F=%D0%98%D0%B2%D0%B0%D0%BD%D0%BE%D0%B2"}


URLComponents aplica automáticamente la codificación porcentual correcta para cada componente. Esto te ahorra dolores de cabeza y hace que el código sea más limpio.



Error #2: Ignorar queryItems en favor de la construcción manual de cadenas



"¿Por qué necesito estos componentes? Simplemente concatenaré la cadena con +". ¿Te suena familiar? Y esto lleva al segundo error popular. Construir manualmente una cadena de consulta es un camino directo a los errores.



// ❌ Error: construcción manual de la cadena de consultalet name = "Ivan & Petrov"let query = "name=\\(name)&age=25"let urlString = "https://example.com?\\(query)"// Problema: el ampersand en el nombre se interpretará como un separador de parámetros


Incluso si reemplazas los espacios, olvidarás &, #, ? y otros caracteres especiales. ¿Y si el parámetro proviene del usuario? Espera inyecciones y solicitudes rotas.



Solución: usa siempre queryItems



// ✅ Correcto: queryItems hace todo el trabajo por tivar components = URLComponents(string: "https://example.com")!components.queryItems = [    URLQueryItem(name: "name", value: "Ivan & Petrov"),    URLQueryItem(name: "age", value: "25"),    URLQueryItem(name: "q", value: "Swift encode URL tutorial")]

if let url = components.url { print(url.absoluteStr

Blogs

Book Recommendations