Problème conversion NSString vers NSURL

Bonjour,

Toujours sur ma p'tite appli avec un p'tit problème de conversion string to url :(

Dès qu'une url contient le char "&", ça bug au niveau d'apache (serveur http intégré à osx).

    NSString *path = [NSString stringWithFormat:@"%@%@",[representedObject valueForKey:@"itemImage"], @"/cover.jpg"];        
    NSString *web = [path stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLHostAllowedCharacterSet]];
    NSString* stringURL = [NSString stringWithFormat:@"http://192.168.25.1/.get_cover.php?width=300&height=300&quality=85&image=/%@", web];
    NSURL* url = [NSURL URLWithString:stringURL];

Lors de la conversion string to url chaque "/" est remplacé par %2F, jusqu'ici pas de problème mais pas moyen de substituer "&" en %26.

Si je substitue le "&" à la main sur le serveur ça bug avec les %2F... que je dois repasser en "/" pour que ça passe :D

Y'a un moyen de manipuler directement la chaine NSURL ? parce qu'évidemment, si je le fais sur le string en essayant de tricher
ça marche pas :p

NSErrorFailingURLStringKey=http://192.168.25.1/.get_cover.php?width=300&height=300&quality=85&image=/Rock/The Mamas & The Papas/04 - The Papas & The Mamas/cover.jpg

Réponses

  • Utilise la classe NSURLComponents et plus particulièrement sa propriété queryItems qui te permet de spécifier tout ça sans t'emmêler les pinceaux avec des strings.
    Je te laisse consulter la documentation pour bien comprendre.

  • LexxisLexxis Membre
    février 2019 modifié #3

    URLHostAllowedCharacterSet conserve les "&".
    Peut être faudrait-il choisir URLQueryAllowedCharacterSet et créer une instance NSMutableCharacterSet basé sur URLQueryAllowedCharacterSet et retirer le caractère "&" (removeCharactersInString).

    Il faut ensuite utiliser stringByAddingPercentEncodingWithAllowedCharacters mais uniquement sur la chaine contenant le nom de l'image (ainsi les & seront encodés) - comme tu le fais dans ton code - et pas sur la chaine query complète.

  • Évite d'utiliser valueForKey:, préfères objectForKey:, ou la shorthand écriture, via des subcripts: representedObject[@"itemImage"]. Parce qu'en fonction de si c'est un array notamment ou un dictionnaire, le résultat pourrait te surprendre. Pour éviter de faire cette erreur en débutant, je conseille vivement d'utiliser donc le objectForKey:.

    Sinon, je conseille également les NSURLComponents.

  • Mouais, rien n'y fait...

    Ca a fini en "CFURLCreateStringByAddingPercentEscapes", Xcode me dit que c'est mal et que je doit utiliser stringByAddingPercentEncodingWithAllowedCharacters mais vu qu'il est pas fichu de faire le boulot correctement il continuera à râler :p

    Merci pour toutes vos infos bien utile.

Connectez-vous ou Inscrivez-vous pour répondre.