iOS desde cero (II): Peticiones y JSON

Introducción

Probablemente, más del 95% de las aplicaciones móviles utilizan Internet para intercambiar datos, generalmente con un servidor al que hacen peticiones para obtener datos y para enviar datos. El formato más utilizado para este intercambio es JSON, por lo que conocer cómo realizar peticiones de red y cómo procesar la información en formato JSON es fundamental.

Realizando una petición GET

Lo más fácil es obtener datos de un servidor, puesto que nosotros no tenemos que enviarle nada, es solo llamar al endpoint y recoger los datos. Por eso vamos a empezar con una simple llamada GET a la API de OpenWeather.

func printDataFromApi() {
    let url = URL(string: "https://api.openweathermap.org/data/2.5/weather?q=London,uk&appId=<your api key>")
    let task = URLSession.shared.dataTask(with: url) {
        data, response, error in
        if error != nil {
            print(error)
        } else {
            if let content = data {
                do {
                    let jsonResult = try JSONSerialization.jsonObject(with: content, options: JSONSerialization.ReadingOptions.mutableContainers)
                    print(jsonResult)
                } catch {
                    print("Exception while processing JSON")
                }
            }
        }
    }

    task.resume()
}

Nota: donde pone "your api key", cambiar por la API key recibida al registrarse en la API de OpenWeather.

Parece mucho código, pero en realidad lo único que hacemos es crear una task para realizar nuestra petición de red, si recibimos un error lo imprimimos y, si no, parseamos el JSON y lo imprimimos.

Este jsonResult viene a ser como un diccionario, por lo que si tiene un campo name, podemos acceder a él como jsonResult["name"]. Eso sí, esto nos va a devolver un opcional, por lo que para utilizarlo tendremos que realizar un unwrap.

En resumen, que si queremos, podemos transformar cualquier JSON a un NSDictionary y cualquier lista dentro de ese JSON a un NSArray. Por ejemplo, si tenemos el siguiente JSON:

{
  "coord": {
    "lon": -0.1257,
    "lat": 51.5085
  },
  "weather": [
    {
      "id": 800,
      "main": "Clear",
      "description": "clear sky",
      "icon": "01d"
    }
  ],
  "base": "stations",
  "main": {
    "temp": 302.73,
    "feels_like": 301.66,
    "temp_min": 300.68,
    "temp_max": 305.25,
    "pressure": 1019,
    "humidity": 32
  },
  "visibility": 10000,
  "wind": {
    "speed": 5.66,
    "deg": 100
  },
  "clouds": {
    "all": 0
  },
  "dt": 1660239444,
  "sys": {
    "type": 2,
    "id": 268730,
    "country": "GB",
    "sunrise": 1660192769,
    "sunset": 1660246327
  },
  "timezone": 3600,
  "id": 2643743,
  "name": "London",
  "cod": 200
}

Imaginemos que queremos conseguir la descripción del primer elemento que hay en weather. Para eso, y obviando el hecho de que estamos utilizando force-unwrap para mayor brevedad de código, haríamos lo siguiente:

let jsonDict = jsonResult as! NSDictionary
let weathers = jsonDict["weather"] as! NSArray
let firstWeather = weathers.firstObject as! NSDictionary
let description = firstWeather["description"] as! String
print(description)

Este código imprimiría:

Output: clear sky

Otras peticiones

Nota: en construcción.