En aquest tema, aprendrem com gestionar les xarxes en Swift, una habilitat essencial per a qualsevol desenvolupador d'aplicacions mòbils. Les aplicacions modernes sovint necessiten comunicar-se amb serveis web per obtenir dades, enviar informació o interactuar amb altres sistemes. Swift proporciona diverses eines i biblioteques per facilitar aquestes tasques.

Continguts

Introducció a les Xarxes en Swift

Les xarxes en Swift es basen principalment en la classe URLSession, que proporciona una API per a la descàrrega i càrrega de dades a través de la xarxa. Aquesta classe és molt flexible i permet realitzar peticions HTTP/HTTPS de manera senzilla.

URLSession

URLSession és la classe principal per gestionar les xarxes en Swift. Proporciona diferents mètodes per realitzar peticions de xarxa, com ara dataTask, uploadTask i downloadTask.

Exemple Bàsic d'URLSession

import Foundation

let url = URL(string: "https://api.example.com/data")!

let task = URLSession.shared.dataTask(with: url) { data, response, error in
    if let error = error {
        print("Error: \(error)")
        return
    }
    
    guard let data = data else {
        print("No data received")
        return
    }
    
    // Processar les dades
    print("Data: \(data)")
}

task.resume()

Explicació del Codi

  1. Importació de Foundation: Necessitem importar el framework Foundation per utilitzar URLSession.
  2. Creació de l'URL: Creem un objecte URL amb l'adreça del servei web.
  3. Creació de la Tasca: Utilitzem URLSession.shared.dataTask per crear una tasca de xarxa.
  4. Gestió de la Resposta: En el bloc de finalització, gestionem l'error, la resposta i les dades rebudes.
  5. Inici de la Tasca: Finalment, iniciem la tasca amb task.resume().

Realitzar Peticions GET

Les peticions GET s'utilitzen per obtenir dades d'un servidor. A continuació, es mostra un exemple de com realitzar una petició GET.

Exemple de Petició GET

import Foundation

func fetchData() {
    let url = URL(string: "https://api.example.com/data")!
    
    let task = URLSession.shared.dataTask(with: url) { data, response, error in
        if let error = error {
            print("Error: \(error)")
            return
        }
        
        guard let data = data else {
            print("No data received")
            return
        }
        
        do {
            let json = try JSONSerialization.jsonObject(with: data, options: [])
            print("JSON: \(json)")
        } catch {
            print("Error parsing JSON: \(error)")
        }
    }
    
    task.resume()
}

fetchData()

Explicació del Codi

  1. Funció fetchData: Definim una funció per encapsular la lògica de la petició GET.
  2. Serialització JSON: Utilitzem JSONSerialization per convertir les dades rebudes en un objecte JSON.

Realitzar Peticions POST

Les peticions POST s'utilitzen per enviar dades a un servidor. A continuació, es mostra un exemple de com realitzar una petició POST.

Exemple de Petició POST

import Foundation

func postData() {
    let url = URL(string: "https://api.example.com/data")!
    var request = URLRequest(url: url)
    request.httpMethod = "POST"
    
    let parameters: [String: Any] = [
        "name": "John",
        "age": 30
    ]
    
    request.httpBody = try? JSONSerialization.data(withJSONObject: parameters, options: [])
    request.addValue("application/json", forHTTPHeaderField: "Content-Type")
    
    let task = URLSession.shared.dataTask(with: request) { data, response, error in
        if let error = error {
            print("Error: \(error)")
            return
        }
        
        guard let data = data else {
            print("No data received")
            return
        }
        
        do {
            let json = try JSONSerialization.jsonObject(with: data, options: [])
            print("JSON: \(json)")
        } catch {
            print("Error parsing JSON: \(error)")
        }
    }
    
    task.resume()
}

postData()

Explicació del Codi

  1. Configuració de la Petició: Creem un objecte URLRequest i configurem el mètode HTTP a "POST".
  2. Paràmetres de la Petició: Definim els paràmetres que volem enviar i els convertim a JSON.
  3. Capçaleres HTTP: Afegim la capçalera "Content-Type" per indicar que estem enviant JSON.

Gestió de Respostes

La gestió de respostes implica processar les dades rebudes del servidor i gestionar els errors que puguin ocórrer.

Exemple de Gestió de Respostes

import Foundation

func handleResponse(data: Data?, response: URLResponse?, error: Error?) {
    if let error = error {
        print("Error: \(error)")
        return
    }
    
    guard let data = data else {
        print("No data received")
        return
    }
    
    do {
        let json = try JSONSerialization.jsonObject(with: data, options: [])
        print("JSON: \(json)")
    } catch {
        print("Error parsing JSON: \(error)")
    }
}

Explicació del Codi

  1. Funció handleResponse: Definim una funció per gestionar la resposta de la xarxa.
  2. Gestió d'Errors: Comprovem si hi ha errors i els imprimim.
  3. Processament de Dades: Convertim les dades rebudes a JSON i les imprimim.

Gestió d'Errors

La gestió d'errors és crucial per assegurar que la nostra aplicació pugui gestionar situacions inesperades de manera elegant.

Exemple de Gestió d'Errors

import Foundation

func fetchDataWithErrorHandling() {
    let url = URL(string: "https://api.example.com/data")!
    
    let task = URLSession.shared.dataTask(with: url) { data, response, error in
        if let error = error {
            print("Error: \(error.localizedDescription)")
            return
        }
        
        guard let httpResponse = response as? HTTPURLResponse, (200...299).contains(httpResponse.statusCode) else {
            print("Server error")
            return
        }
        
        guard let data = data else {
            print("No data received")
            return
        }
        
        do {
            let json = try JSONSerialization.jsonObject(with: data, options: [])
            print("JSON: \(json)")
        } catch {
            print("Error parsing JSON: \(error)")
        }
    }
    
    task.resume()
}

fetchDataWithErrorHandling()

Explicació del Codi

  1. Comprovació del Codi d'Estat: Verifiquem que el codi d'estat de la resposta estigui en el rang 200-299.
  2. Gestió d'Errors de Xarxa: Imprimim una descripció de l'error si n'hi ha.

Exercicis Pràctics

Exercici 1: Petició GET

Realitza una petició GET a l'API pública https://jsonplaceholder.typicode.com/posts i imprimeix els resultats.

Solució

import Foundation

func fetchPosts() {
    let url = URL(string: "https://jsonplaceholder.typicode.com/posts")!
    
    let task = URLSession.shared.dataTask(with: url) { data, response, error in
        if let error = error {
            print("Error: \(error)")
            return
        }
        
        guard let data = data else {
            print("No data received")
            return
        }
        
        do {
            let json = try JSONSerialization.jsonObject(with: data, options: [])
            print("JSON: \(json)")
        } catch {
            print("Error parsing JSON: \(error)")
        }
    }
    
    task.resume()
}

fetchPosts()

Exercici 2: Petició POST

Realitza una petició POST a l'API pública https://jsonplaceholder.typicode.com/posts amb els següents paràmetres: title, body i userId.

Solució

import Foundation

func createPost() {
    let url = URL(string: "https://jsonplaceholder.typicode.com/posts")!
    var request = URLRequest(url: url)
    request.httpMethod = "POST"
    
    let parameters: [String: Any] = [
        "title": "foo",
        "body": "bar",
        "userId": 1
    ]
    
    request.httpBody = try? JSONSerialization.data(withJSONObject: parameters, options: [])
    request.addValue("application/json", forHTTPHeaderField: "Content-Type")
    
    let task = URLSession.shared.dataTask(with: request) { data, response, error in
        if let error = error {
            print("Error: \(error)")
            return
        }
        
        guard let data = data else {
            print("No data received")
            return
        }
        
        do {
            let json = try JSONSerialization.jsonObject(with: data, options: [])
            print("JSON: \(json)")
        } catch {
            print("Error parsing JSON: \(error)")
        }
    }
    
    task.resume()
}

createPost()

Conclusió

En aquesta secció, hem après com gestionar les xarxes en Swift utilitzant URLSession. Hem vist com realitzar peticions GET i POST, gestionar respostes i errors, i hem practicat amb exercicis pràctics. Aquestes habilitats són fonamentals per desenvolupar aplicacions mòbils que necessiten comunicar-se amb serveis web. En el següent tema, explorarem com utilitzar Core Data per gestionar dades persistents en les nostres aplicacions.

© Copyright 2024. Tots els drets reservats