En fait, toutes les réponses précédentes contiennent au moins quelques inexactitudes, qui, pour de nombreuses valeurs communes de l'utilisateur fourni du texte dans les TextFields ne pas communiquer correctement avec le serveur
stringByAddingPercentEscapesUsingEncoding:
pour cent échappe tous les caractères qui ne sont pas URL valide personnages. Cette méthode doit être appliquée une fois à l'URL entière.
Une réponse précédente prétend que stringByAddingPercentEscapesUsingEncoding:
fonctionne comme les classes de construction d'URL dans de nombreux langages de script, où vous ne devez pas l'appliquer à l'ensemble de la chaîne d'URL, mais ce n'est pas le cas. N'importe qui peut facilement vérifier cela en vérifiant sa sortie pour &
s et ?
s non échappé. Il est donc bon de l'appliquer à l'intégralité de la chaîne, mais il ne suffit pas de l'appliquer à votre contenu d'URL "dynamique".
La réponse précédente est correcte dans la mesure où vous devez faire un peu plus de travail sur les noms et les valeurs qui vont dans votre chaîne de requête CGI. Depuis CGI est spécifié par RFC3875, cela est souvent appelé RFC3875 échapper à pourcentage.Il veille à ce que vos noms et les valeurs ne contiennent pas de caractères qui sont des caractères d'URL valides mais qui sont importantes dans d'autres parties de l'URL (;
, ?
, :
, @
, &
, =
, $
, +
, {
, }
, <
Toutefois, il est très important de terminer également en effectuant des pourcentages d'URL clairs sur la chaîne complète pour s'assurer que tous les caractères de la chaîne sont des caractères d'URL valides. Bien que vous ne le fassiez pas dans votre exemple, en général, il peut y avoir des caractères dans une partie 'statique' de la chaîne qui ne sont pas des caractères d'URL valides, vous devez donc également leur échapper.
Malheureusement, NSString
ne nous donne pas le pouvoir d'échapper aux caractères significatifs RFC3875 donc nous devons plonger dans CFString
pour le faire. Il est évident que l'utilisation CFString
est une douleur si j'ajoute généralement un Category
sur NSString
comme ceci:
@interface NSString (RFC3875)
- (NSString *)stringByAddingRFC3875PercentEscapesUsingEncoding:(NSStringEncoding)encoding;
@end
@implementation NSString (RFC3875)
- (NSString *)stringByAddingRFC3875PercentEscapesUsingEncoding:(NSStringEncoding)encoding {
CFStringEncoding cfEncoding = CFStringConvertNSStringEncodingToEncoding(encoding);
NSString *rfcEscaped = (NSString *)CFURLCreateStringByAddingPercentEscapes(
NULL,
(CFStringRef)self,
NULL,
(CFStringRef)@";/?:@&=$+{}<>,",
cfEncoding);
return [rfcEscaped autorelease];
}
@end
Avec cette Category
en place, le problème d'origine pourrait être résolu correctement avec ce qui suit:
NSString *urlEscapedBase = [@"http://server.com/file.php" stringByAddingPercentEscapesUsingEncoding:
NSUTF8StringEncoding];
NSString *rfcEscapedName = [nameField.text stringByAddingRFC3875PercentEscapesUsingEncoding:
NSUTF8StringEncoding];
NSString *rfcEscapedTags = [tagsField.text stringByAddingRFC3875PercentEscapesUsingEncoding:
NSUTF8StringEncoding];
NSString *rfcEscapedEntry = [dreamEntry.text stringByAddingRFC3875PercentEscapesUsingEncoding:
NSUTF8StringEncoding];
NSString *urlStr = [NSString stringWithFormat:@"%@?name=%@&tags=%@&entry=%@",
urlEscapedBase,
rfcEscapedName,
rfcEscapedTags,
rfcEscapedEntry];
NSURL *url = [NSURL URLWithString:urlStr];
Ceci est un peu lourd variable juste être plus clair. Notez également que la liste de variables fournie à stringWithFormat:
ne doit pas être nil
terminée. La chaîne de format décrit le nombre précis de variables qui devraient le suivre. En outre, techniquement, les chaînes pour les noms de chaînes de requête (nom, balises, entrée, ..) doivent être exécutées automatiquement par stringByAddingPercentEscapesUsingEncoding:
mais dans ce petit exemple, nous pouvons facilement voir qu'elles ne contiennent aucun caractère URL invalide.
Pour voir pourquoi les solutions précédentes sont incorrectes, imaginez que le texte de saisie utilisateur dans dreamEntry.text
contient un &
, ce qui n'est pas improbable. Avec les solutions précédentes, tout le texte suivant ce caractère serait perdu au moment où le serveur recevrait ce texte, puisque l'esperluette non échappée serait interprétée par le serveur comme mettant fin à la partie valeur de cette paire de chaînes de requête.
le point pris. Merci! – bcsantos