Avec tous les objets de gestion d'URL qui traînent dans les bibliothèques Cocoa standard (NSURL, NSMutableURL, NSMutableURLRequest, etc.), je sais que je dois négliger un moyen facile de composer par programme une requête GET.
Actuellement, j'ajoute manuellement "?" suivi de paires nom-valeur jointes par "&", mais toutes mes paires nom et valeur doivent être codées manuellement afin que NSMutableURLRequest n'échoue pas entièrement lorsqu'il tente de se connecter à l'URL.
Cela ressemble à quelque chose pour lequel je devrais pouvoir utiliser une API pré-cuite ... y a-t-il quelque chose hors de la boîte pour ajouter un NSDictionary de paramètres de requête à un NSURL? Y a-t-il une autre façon d'aborder cela?
objective-c
nsurl
Zev Eisenberg
la source
la source
Réponses:
Introduit dans iOS8 et OS X 10.10 est
NSURLQueryItem
, qui peut être utilisé pour créer des requêtes. À partir de la documentation sur NSURLQueryItem :Pour en créer un, utilisez l'initialiseur désigné
queryItemWithName:value:
, puis ajoutez-lesNSURLComponents
pour générer un fichierNSURL
. Par exemple:Notez que le point d'interrogation et l'esperluette sont automatiquement gérés. Créer un à
NSURL
partir d'un dictionnaire de paramètres est aussi simple que:J'ai également écrit un article de blog sur la création d'URL avec
NSURLComponents
etNSURLQueryItems
.la source
Vous pouvez créer une catégorie pour
NSDictionary
ce faire - il n'y a pas non plus de moyen standard dans la bibliothèque Cocoa que je puisse trouver. Le code que j'utilise ressemble à ceci:avec cette implémentation:
Je pense que le code est assez simple, mais j'en discute plus en détail à http://blog.ablepear.com/2008/12/urlencoding-category-for-nsdictionary.html .
la source
Je voulais utiliser la réponse de Chris, mais elle n'était pas écrite pour le comptage automatique des références (ARC), alors je l'ai mise à jour. J'ai pensé coller ma solution au cas où quelqu'un d'autre aurait le même problème. Remarque: remplacez
self
par le nom de l'instance ou de la classe, le cas échéant.la source
Les autres réponses fonctionnent très bien si les valeurs sont des chaînes, mais si les valeurs sont des dictionnaires ou des tableaux, ce code gérera cela.
Il est important de noter qu'il n'y a pas de moyen standard de passer un tableau / dictionnaire via la chaîne de requête, mais PHP gère cette sortie très bien
Exemples
toto = bar & traductions [un] = uno & traductions [deux] = dos & traductions [trois] = tres
toto = bar & traductions [] = uno & traductions [] = dos & traductions [] = tres
la source
CFURLCreateStringByAddingPercentEscapes
appels parstringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]
J'ai refactoré et converti en réponse ARC par AlBeebe
}
la source
[NSString stringWithFormat:@"?%@",[pairs componentsJoinedByString:@"&"]];
CFURLCreateStringByAddingPercentEscapes
appelsstringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]
Si vous utilisez déjà AFNetworking (comme c'était le cas avec moi), vous pouvez utiliser sa classe
AFHTTPRequestSerializer
pour créer le fichier requisNSURLRequest
.[[AFHTTPRequestSerializer serializer] requestWithMethod:@"GET" URLString:@"YOUR_URL" parameters:@{PARAMS} error:nil];
Si vous n'avez besoin que de l'URL pour votre travail, utilisez
NSURLRequest.URL
.la source
Voici un exemple simple dans Swift (iOS8 +):
la source
queryItems
sont disponibles à partir d'iOS8.0.J'ai suivi la recommandation de Joel d'utiliser
URLQueryItems
et je suis devenu une extension Swift (Swift 3)(La
self.init
méthode est un peu ringarde, mais il n'y avait pas d'NSURL
init avec des composants)Peut être utilisé comme
la source
J'ai une autre solution:
http://splinter.com.au/build-a-url-query-string-in-obj-c-from-a-dict
Vous pouvez ensuite l'utiliser comme ceci:
la source
la source
Encore une autre solution, si vous utilisez RestKit, il y a une fonction
RKURLEncodedSerialization
appeléeRKURLEncodedStringFromDictionaryWithEncoding
qui fait exactement ce que vous voulez.la source
Moyen simple de convertir NSDictionary en chaîne de requête URL dans Objective-c
Ex: first_name = Steve & middle_name = Gates & last_name = Jobs & address = Palo Alto, Californie
L'espoir aidera :)
la source