#Négociation de contenu

Rentrons dans le dur, nous allons maintenant faire appel à une API pour récupérer des objets JSON, puis les transformer afin de les exploiter dans notre application.

#🧠 Un peu de théorie

JSON signifie JavaScript Object Notation. C’est un format de données très utilisé pour échanger des données entre un serveur et un client. Et comme son nom l’indique, il est très proche de la syntaxe JavaScript, ce qui le rend très facile à lire et à écrire avec du Javascript.

Sauf que nous sommes en Swift, et que nous avons besoin de transformer ce JSON en objet Swift pour pouvoir l’utiliser dans notre application. On appel ces opérations de la négociation de contenu, car on négocie le format de données avec le serveur.

Nous allons donc avoir besoin de deux choses :

  • Encoder : Transformer un objet Swift en JSON (en Javascript JSON.stringify)
  • Decoder : Transformer un JSON en objet Swift (en Javascript JSON.parse)

Puis que Javascript n’est pas un langage fortement typé, il n’y a pas besoin de spécifier le type de données que l’on veut récupérer, c’est donc simple et rapide, mais cela peut poser des problèmes de sécurité et de fiabilité.

Pourquoi c’est important ?

En Swift, nous avons besoin de spécifier le type de données que l’on veut récupérer, ce qui est plus long, mais plus sûr et plus fiable.

🤔 Comment faire cela en Swift ? Et bien c’est très simple, il suffit d’utiliser le protocole Codable qui permet de transformer un objet Swift en JSON et inversement.

#🔧 Exercice 1 ~25min

Sortons de notre sujet quelques minutes, créez un fichier de test dans votre projet pour notre experimentation

Créez dans ce fichier une structure Movie qui représente un film, avec les propriétés suivantes :

swift
struct Movie: Codable {
    let title: String
    let releaseYear: Int
    let genre: String
}

Puis copiez/collez le code suivant dans votre fichier de test :

swift
let jsonString = """
[
    {
        "title": "Inception",
        "releaseYear": 2010,
        "genre": "Sci-Fi"
    },
    {
        "title": "The Dark Knight",
        "releaseYear": 2008,
        "genre": "Action"
    }
]
"""

Enfin utilisez le code suivant pour transformer votre JSON en objet Swift :

swift

if let jsonData = jsonString.data(using: .utf8) {
    do {
        let movies = try JSONDecoder().decode([Movie].self, from: jsonData)
        // Ici, vous avez un tableau de films que vous pouvez utiliser.
        for movie in movies {
            print("Film: \(movie.title), Année de sortie: \(movie.releaseYear), Genre: \(movie.genre)")
        }
    } catch {
        print("Erreur de décodage: \(error)")
    }
}

  • Modifiez le modèle Movie pour inclure un nouveau champ optionnel director (String).
  • Mettez à jour le JSON en dur pour inclure des informations sur le réalisateur Director, il doit contenir un nom et un prénom et doit être décodé également.
  • Printez les détails de chaque film, y compris le nom du réalisateur lorsqu’il est disponible.

#📲 Retour à notre projet

Pour afficher la page d’accueil de l’application nous ferons appel à la route suivante :

sh
https://api.unsplash.com/photos

Attention

Cette route nécessite une authentification, vous devez donc ajouter votre clé d’API en tant que queryParameter dans votre requête.

Lancez la requête dans votre client HTTP favori (Postman, Insomnia, etc.) et regardez la réponse.

Comme vous le voyez, la réponse est un tableau d’objets JSON, qui représentent chacun une image. Et pour notre application nous avons besoin d’une partie de ces informations, nous n’avons pas besoin de créer un miroir parfaire des objets json en objet Swift.

#🔧 Exercice 2 ~30min

  1. Listez les propriétés dont vous avez besoin pour afficher une image dans la grille.
  2. Copiez/Coller un objet JSON de la réponse de l’API quelque part et simplifier le JSON (retirer les objets que vous n’avez pas besoin)
  3. Utilisez l’outil 🧰 QuickType pour générer un objet Swift à partir de votre JSON simplifié.

Nommez vos objets comme vous le souhaitez, mais faites en sorte que votre objet principal respecte le protocole Identifiable pour pouvoir l’utiliser dans un ForEach.

#Tips

Pour notre Grille nous aurons surement besoin des informations suivantes à minima

  • L’URL de l’image (Utilisez un String, n’essayez pas de transformer l’URL en URL pour le moment)
  • L’id de l’image -> Pour que l’objet respecte le protocole Identifiable
  • Le nom de l’auteur, et d’autres infos si vous le souhaitez
  • Le slug de l’image

Vous devrez remplir un enum CodingKeys pour que le décodage fonctionne correctement.

A la fin de cette étape vous devriez avoir un objet Swift qui ressemble à cela :

swift
struct UnsplashPhoto: Codable, Identifiable {
    let id: String
    let slug: String
    let author: User
    let url: UnsplashImageUrls
}

struct User: Codable {
    let name: String
}

struct UnsplashPhotoUrls: Codable {
    let raw: String
    let full: String
    let regular: String
    let small: String
    let thumb: String
}

(Optionnel) Vous pouvez tenter d’utilisez votre playground pour vérifier que votre décodage fonctionne correctement.