En aquest tema, aprendrem com treballar amb xarxes i APIs en les aplicacions desenvolupades amb Xcode. Aquest és un aspecte crucial per a moltes aplicacions modernes que necessiten comunicar-se amb serveis web per obtenir dades, enviar informació o interactuar amb altres sistemes.

Objectius d'Aprenentatge

  • Entendre els conceptes bàsics de les xarxes i les APIs.
  • Aprendre a fer sol·licituds HTTP des de Swift.
  • Gestionar respostes de xarxa i errors.
  • Processar dades JSON.
  • Integrar APIs de tercers en les aplicacions.

Conceptes Bàsics de Xarxes i APIs

Què és una API?

Una API (Application Programming Interface) és un conjunt de regles que permeten a una aplicació comunicar-se amb un altre servei. Les APIs sovint utilitzen el protocol HTTP per enviar i rebre dades.

Tipus de Sol·licituds HTTP

Les sol·licituds HTTP més comunes són:

  • GET: Recupera dades d'un servidor.
  • POST: Envia dades al servidor.
  • PUT: Actualitza dades en el servidor.
  • DELETE: Elimina dades del servidor.

Fer Sol·licituds HTTP amb URLSession

Exemple de Sol·licitud GET

import Foundation

// URL de l'API
let url = URL(string: "https://jsonplaceholder.typicode.com/posts")!

// Creació de la sol·licitud
let task = URLSession.shared.dataTask(with: url) { data, response, error in
    // Comprovació d'errors
    if let error = error {
        print("Error: \(error)")
        return
    }
    
    // Comprovació de la resposta
    guard let httpResponse = response as? HTTPURLResponse, httpResponse.statusCode == 200 else {
        print("Resposta no vàlida")
        return
    }
    
    // Processament de les dades
    if let data = data {
        do {
            // Convertir les dades a JSON
            let json = try JSONSerialization.jsonObject(with: data, options: [])
            print("JSON: \(json)")
        } catch {
            print("Error en processar el JSON: \(error)")
        }
    }
}

// Iniciar la sol·licitud
task.resume()

Explicació del Codi

  1. Creació de la URL: Es crea una instància de URL amb l'adreça de l'API.
  2. Creació de la Sol·licitud: Es crea una tasca de dades (dataTask) amb URLSession.shared.
  3. Gestió de la Resposta: Es comprova si hi ha errors i si la resposta és vàlida.
  4. Processament de les Dades: Si les dades són vàlides, es converteixen a JSON i es mostren.

Exemple de Sol·licitud POST

import Foundation

// URL de l'API
let url = URL(string: "https://jsonplaceholder.typicode.com/posts")!

// Dades a enviar
let postData = [
    "title": "foo",
    "body": "bar",
    "userId": 1
]

// Convertir les dades a JSON
let jsonData = try! JSONSerialization.data(withJSONObject: postData, options: [])

// Creació de la sol·licitud
var request = URLRequest(url: url)
request.httpMethod = "POST"
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
request.httpBody = jsonData

// Creació de la tasca
let task = URLSession.shared.dataTask(with: request) { data, response, error in
    // Comprovació d'errors
    if let error = error {
        print("Error: \(error)")
        return
    }
    
    // Comprovació de la resposta
    guard let httpResponse = response as? HTTPURLResponse, httpResponse.statusCode == 201 else {
        print("Resposta no vàlida")
        return
    }
    
    // Processament de les dades
    if let data = data {
        do {
            // Convertir les dades a JSON
            let json = try JSONSerialization.jsonObject(with: data, options: [])
            print("JSON: \(json)")
        } catch {
            print("Error en processar el JSON: \(error)")
        }
    }
}

// Iniciar la sol·licitud
task.resume()

Explicació del Codi

  1. Creació de la URL: Es crea una instància de URL amb l'adreça de l'API.
  2. Dades a Enviar: Es defineixen les dades a enviar en format diccionari.
  3. Convertir a JSON: Es converteixen les dades a JSON.
  4. Creació de la Sol·licitud: Es crea una sol·licitud URLRequest amb el mètode POST i es configuren les capçaleres.
  5. Gestió de la Resposta: Es comprova si hi ha errors i si la resposta és vàlida.
  6. Processament de les Dades: Si les dades són vàlides, es converteixen a JSON i es mostren.

Exercicis Pràctics

Exercici 1: Fer una Sol·licitud GET

  1. Crea una sol·licitud GET a l'API https://jsonplaceholder.typicode.com/users.
  2. Mostra els noms dels usuaris en la consola.

Solució

import Foundation

let url = URL(string: "https://jsonplaceholder.typicode.com/users")!

let task = URLSession.shared.dataTask(with: url) { data, response, error in
    if let error = error {
        print("Error: \(error)")
        return
    }
    
    guard let httpResponse = response as? HTTPURLResponse, httpResponse.statusCode == 200 else {
        print("Resposta no vàlida")
        return
    }
    
    if let data = data {
        do {
            let json = try JSONSerialization.jsonObject(with: data, options: []) as? [[String: Any]]
            json?.forEach { user in
                if let name = user["name"] as? String {
                    print("Nom: \(name)")
                }
            }
        } catch {
            print("Error en processar el JSON: \(error)")
        }
    }
}

task.resume()

Exercici 2: Fer una Sol·licitud POST

  1. Crea una sol·licitud POST a l'API https://jsonplaceholder.typicode.com/posts.
  2. Envia un nou post amb títol, cos i ID d'usuari.
  3. Mostra la resposta en la consola.

Solució

import Foundation

let url = URL(string: "https://jsonplaceholder.typicode.com/posts")!

let postData = [
    "title": "Nou Post",
    "body": "Aquest és el cos del nou post.",
    "userId": 1
]

let jsonData = try! JSONSerialization.data(withJSONObject: postData, options: [])

var request = URLRequest(url: url)
request.httpMethod = "POST"
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
request.httpBody = jsonData

let task = URLSession.shared.dataTask(with: request) { data, response, error in
    if let error = error {
        print("Error: \(error)")
        return
    }
    
    guard let httpResponse = response as? HTTPURLResponse, httpResponse.statusCode == 201 else {
        print("Resposta no vàlida")
        return
    }
    
    if let data = data {
        do {
            let json = try JSONSerialization.jsonObject(with: data, options: [])
            print("JSON: \(json)")
        } catch {
            print("Error en processar el JSON: \(error)")
        }
    }
}

task.resume()

Resum

En aquesta secció, hem après com fer sol·licituds HTTP GET i POST utilitzant URLSession en Swift. Hem vist com gestionar respostes de xarxa, processar dades JSON i integrar APIs en les nostres aplicacions. Aquestes habilitats són essencials per desenvolupar aplicacions modernes que necessiten comunicar-se amb serveis web.

© Copyright 2024. Tots els drets reservats