Le SDK d'iOS 7 dispose désormais d'une meilleure solution de rechange pour stringByAddingPercentEscapesUsingEncoding
qui vous permet de spécifier que vous voulez que tous les caractères soient échappés sauf certains caractères autorisés. Cela fonctionne bien si vous construisez l'URL en plusieurs parties :
NSString * unescapedQuery = [[NSString alloc] initWithFormat:@"?myparam=%d", numericParamValue];
NSString * escapedQuery = [unescapedQuery stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
NSString * urlString = [[NSString alloc] initWithFormat:@"http://ExampleOnly.com/path.ext%@", escapedQuery];
Bien qu'il soit moins fréquent que les autres parties de l'URL soient des variables, il existe des constantes dans la catégorie NSURLUtilities pour celles-ci également :
[NSCharacterSet URLHostAllowedCharacterSet]
[NSCharacterSet URLUserAllowedCharacterSet]
[NSCharacterSet URLPasswordAllowedCharacterSet]
[NSCharacterSet URLPathAllowedCharacterSet]
[NSCharacterSet URLFragmentAllowedCharacterSet]
[NSCharacterSet URLQueryAllowedCharacterSet]
comprend tous des caractères autorisés dans la partie "requête" de l'URL (la partie commençant par le symbole ?
et avant le #
pour un fragment, le cas échéant), y compris le ?
y el &
ou =
qui sont utilisés pour délimiter les noms et les valeurs des paramètres. Pour les paramètres de requête ayant des valeurs alphanumériques, n'importe lequel de ces caractères peut être inclus dans les valeurs des variables utilisées pour construire la chaîne de requête. Dans ce cas, chaque partie de la chaîne de requête doit être échappée, ce qui nécessite un peu plus de travail :
NSMutableCharacterSet * URLQueryPartAllowedCharacterSet; // possibly defined in class extension ...
// ... and built in init or on first use
URLQueryPartAllowedCharacterSet = [[NSCharacterSet URLQueryAllowedCharacterSet] mutableCopy];
[URLQueryPartAllowedCharacterSet removeCharactersInString:@"&+=?"]; // %26, %3D, %3F
// then escape variables in the URL, such as values in the query and any fragment:
NSString * escapedValue = [anUnescapedValue stringByAddingPercentEncodingWithAllowedCharacters:URLQueryPartAllowedCharacterSet];
NSString * escapedFrag = [anUnescapedFrag stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLFragmentAllowedCharacterSet]];
NSString * urlString = [[NSString alloc] initWithFormat:@"http://ExampleOnly.com/path.ext?myparam=%@#%@", escapedValue, escapedFrag];
NSURL * url = [[NSURL alloc] initWithString:urlString];
El unescapedValue
peut même être une URL entière, par exemple pour un rappel ou une redirection :
NSString * escapedCallbackParamValue = [anAlreadyEscapedCallbackURL stringByAddingPercentEncodingWithAllowedCharacters:URLQueryPartAllowedCharacterSet];
NSURL * callbackURL = [[NSURL alloc] initWithString:[[NSString alloc] initWithFormat:@"http://ExampleOnly.com/path.ext?callback=%@", escapedCallbackParamValue]];
Note : N'utilisez pas NSURL initWithScheme:(NSString *)scheme host:(NSString *)host path:(NSString *)path
pour une URL avec une chaîne de requête, car cela ajoutera plus d'échappatoires de pourcentage au chemin.
0 votes
Vous devriez ajouter % à cette liste.
0 votes
Je ne comprends pas votre commentaire :-s
0 votes
Il veut dire que le
%
doit lui-même être codé en URL. Ainsi, une chaîne d'entrée comme%2F
se transformera en%252F
. Je suggère également d'ajouter le caractère espace (%20
) à cette liste.