SC #6: Petición web con async/await
Published: (January 17, 2026 at 10:05 AM EST)
1 min read
Source: Dev.to
Source: Dev.to
Código de ejemplo
func performPOSTURLRequest() async throws(NetworkingError) -> PostData {
do {
let request = try buildURLRequest()
let (data, response) = try await URLSession.shared.data(for: request)
guard let statusCode = (response as? HTTPURLResponse)?.statusCode else {
throw NetworkingError.invalidStatusCode(statusCode: -1)
}
guard (200..<300).contains(statusCode) else {
throw NetworkingError.invalidStatusCode(statusCode: statusCode)
}
let decodedResponse = try JSONDecoder().decode(PostResponse.self, from: data)
print("The JSON response contains a name: \(decodedResponse.json.name) and an age: \(decodedResponse.json.age)")
return decodedResponse.json
} catch let error as EncodingError {
throw .encodingFailed(innerError: error)
} catch let error as DecodingError {
throw .decodingFailed(innerError: error)
} catch let error as URLError {
throw .requestFailed(innerError: error)
} catch let error as NetworkingError {
throw error
} catch {
throw .otherError(innerError: error)
}
}
Observaciones
- El compilador avisa si no se ha retornado nada, algo que era imposible con la implementación basada en closures.
- Aunque algunas partes del código lanzan errores de tipo
NetworkingError, es necesario capturarlos explícitamente; de lo contrario, serán atrapados por elcatchgenérico. URLSession.shared.data(for:)devuelve un valor no opcional cuando la petición es exitosa; en caso de error, lanza una excepción.