Convertir une chaîne de caractères

Bonjour,

Je vais essayer d’être le plus claire possible. Je viens de créer une petite app me permettant de récupérer des infos sur des films grâce à une API.
Lorsque j’envoi une requête avec un nom de film imposé tout fonctionne parfaitement.
Maintenant, je souhaiterai utiliser un TextField afin de laisser à l’utilisateur la possibilité de faire sa propre recherche.
Lorsque je saisie un titre simple (« roi » par exemple), tout ce passe bien.
Là où ça se complique, c’est lorsque je saisie un titre avec des espaces ou des accents.

J’ai bien compris d’où vient le problème. Cela renvoi une requête avec le titre du film sous cette forme « le roi lion » alors que le serveur l’attend sous cette forme « Le%20roi%20lion »

Ma question est comment convertir ce que saisie l’utilisateur dans le format attendu par l’API (URI encodé selon la documentation de l’API)?

Bonsoir,

En cherchant sur internet, j’ai vu une piste qui peut t’aider à trouver une réponse ?


import Foundation

let u = URL(fileURLWithPath: "Le roi lion")
print(u)        

Cordialement
Nicolas

1 « J'aime »

Bonsoir @ristretto ,

Merci :pray:

J’ai cherché pendant plus d’une heure sans rien trouver. Il va vraiment falloir que je m’améliore dans la recherche de documentation.
Merci en tout cas pour votre rapidité.

Bon, au final je n’arrive pas à utiliser cette solution.

Il faudrait insérer la réponse « le%20roi%lion » dans une url valide sous cette forme:

« HTTPS://api.monservice.org/3/search/movie?api_key=&query=(laRechercherIci)&page=1

Bonjour,

Il y peut-être plus « propre », mais ça a l’air de fonctionner:

import Foundation
let initialString = "Le roi lion a déjeuné"
let u = URL(fileURLWithPath:initialString )
var validString = u.absoluteString
if validString.hasPrefix("file:///") {
    validString.removeFirst(8)
    let aString = "https://api.monservice.org/3/search/movie?api_key=&query=" + validString + "&page=1"
    if let myUrl = URL(string:aString) {
        
        print(myUrl)
    }
}

Cordialement,
Nicolas

Effectivement, cela fonctionne. Merci beaucoup. Il reste juste la gestion des accents qui n’est pas encodé comme l’entend l’API.
Par exemple, « le dîner de cons » me retourne
le%20di%CC%82ner%20de%20cons

Alors que le serveur attend :
le%20d%C3%AEner%20de%20cons

En tout cas merci @ristretto pour tes recherches et ton aide.

Bonsoir,

Pour les accents, une possibilité pour toi est de ne transmettre à l’Api que les caractères non accentués

C’est possible de supprimer tous les caractères diacritiques d’une chaîne de caractères.
(Fais une recherche sur « diacriticInsensitive »)

Cordialement
Nicolas

Merci. J’ai regardé vite fait, je n’y comprends pas grand chose. Je vais me pencher la dessus après les fêtes.

Un grand merci pour ton aide. Cela m’a permis d’avancer. J’ai contourner les accents en désactivant l’auto correction mais si l’utilisateur saisie des accents le problème reste.

Bon Noel!!!

Bonsoir,

import Foundation
let initialString = "Le roi lion a déjeuné"
if let stringWithoutDiacritics = initialString.applyingTransform(.stripDiacritics,reverse: false) {
    let u = URL(fileURLWithPath:stringWithoutDiacritics )
    var validString = u.absoluteString
    
    
    
    if validString.hasPrefix("file:///") {
        validString.removeFirst(8)
        let aString = "https://api.monservice.org/3/search/movie?api_key=&query=" + validString + "&page=1"
        if let myUrl = URL(string:aString) {
            
            print(myUrl)
        }
}
}

Joyeux Noël,
Nicolas

Peut-être en rédigeant une fonction encodeuse ?

Super @ristretto , cela fonctionne. Un grand merci pour ton temps et ta patience. Au delà de me sortir de la situation cela m’apprend un peu mieux à lire et interpréter la documentation officielle.

Oui, @fjacquemin je pense que cela est plus approprié que de tout mettre dans ma requête.

Merci à vous 2.

@Christophe50 Content pour toi !

Bonjour,

Je reviens sur ce post car je suis revenu sur cette histoire de conversion au format URI. J’ai enfin trouvé la fonction permettant la conversion automatique avec ces fameux %. Voilà ce que cela donne :

import Foundation

let title = "Un été à la plage"
if let encodedTitle = title.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) {
    print(encodedTitle)
}

Je met cette solution si cela peut servir à quelqu’un par la suite.

1 « J'aime »