42 votes

NSURL extrait une seule valeur pour une clé dans une chaîne de paramètres

J'ai une NSURL :

serverCall?x=a&y=b&z=c

Quel est le moyen le plus rapide et le plus efficace d'obtenir la valeur de y ?

Merci

79voto

Dimitris Points 4753

UPDATE :

Depuis 2010, date à laquelle cet article a été rédigé, il semble qu'Apple ait publié un ensemble d'outils à cette fin. Veuillez consulter les réponses ci-dessous à ce sujet.

Une solution à l'ancienne :

Je sais que vous avez dit " le moyen le plus rapide "mais après avoir commencé à faire un test avec NSScanner Je ne pouvais pas m'arrêter. Et même si ce n'est pas le chemin le plus court, c'est très pratique si vous prévoyez d'utiliser souvent cette fonction. J'ai créé un URLParser qui récupère ces variables à l'aide d'un NSScanner . L'utilisation est simple comme bonjour :

URLParser *parser = [[[URLParser alloc] initWithURLString:@"http://blahblahblah.com/serverCall?x=a&y=b&z=c&flash=yes"] autorelease];
NSString *y = [parser valueForVariable:@"y"];
NSLog(@"%@", y); //b
NSString *a = [parser valueForVariable:@"a"];
NSLog(@"%@", a); //(null)
NSString *flash = [parser valueForVariable:@"flash"];
NSLog(@"%@", flash); //yes

Et la classe qui fait cela est la suivante (*fichiers sources en bas de l'article) :

URLParser.h

@interface URLParser : NSObject {
    NSArray *variables;
}

@property (nonatomic, retain) NSArray *variables;

- (id)initWithURLString:(NSString *)url;
- (NSString *)valueForVariable:(NSString *)varName;

@end

URLParser.m

@implementation URLParser
@synthesize variables;

- (id) initWithURLString:(NSString *)url{
    self = [super init];
    if (self != nil) {
        NSString *string = url;
        NSScanner *scanner = [NSScanner scannerWithString:string];
        [scanner setCharactersToBeSkipped:[NSCharacterSet characterSetWithCharactersInString:@"&?"]];
        NSString *tempString;
        NSMutableArray *vars = [NSMutableArray new];
        [scanner scanUpToString:@"?" intoString:nil];       //ignore the beginning of the string and skip to the vars
        while ([scanner scanUpToString:@"&" intoString:&tempString]) {
            [vars addObject:[tempString copy]];
        }
        self.variables = vars;
        [vars release];
    }
    return self;
}

- (NSString *)valueForVariable:(NSString *)varName {
    for (NSString *var in self.variables) {
        if ([var length] > [varName length]+1 && [[var substringWithRange:NSMakeRange(0, [varName length]+1)] isEqualToString:[varName stringByAppendingString:@"="]]) {
            NSString *varValue = [var substringFromIndex:[varName length]+1];
            return varValue;
        }
    }
    return nil;
}

- (void) dealloc{
    self.variables = nil;
    [super dealloc];
}

@end

*Si vous n'aimez pas faire des copier-coller, vous pouvez simplement télécharger les fichiers sources - j'ai rédigé un bref article de blog à ce sujet. aquí .

19voto

Dave DeLong Points 156978

Je suis presque sûr que vous devez l'analyser vous-même. Cependant, ce n'est pas si mal :

NSString * q = [myURL query];
NSArray * pairs = [q componentsSeparatedByString:@"&"];
NSMutableDictionary * kvPairs = [NSMutableDictionary dictionary];
for (NSString * pair in pairs) {
  NSArray * bits = [pair componentsSeparatedByString:@"="];
  NSString * key = [[bits objectAtIndex:0] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
  NSString * value = [[bits objectAtIndex:1] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
  [kvPairs setObject:value forKey:key];
}

NSLog(@"y = %@", [kvPairs objectForKey:@"y"]);

10voto

Troy Points 1372

J'ai utilisé cette catégorie : https://github.com/carlj/NSURL-Parameters .

Il est petit et facile à utiliser :

#import "NSURL+Parameters.h"
...
NSURL *url = [NSURL URLWithString:@"http://foo.bar.com?paramA=valueA&paramB=valueB"];
NSString *paramA = url[@"paramA"];
NSString *paramB = url[@"paramB"];

4voto

ventayol Points 251

Vous pouvez utiliser Google Toolbox pour Mac. Elle ajoute une fonction à NSString pour convertir la chaîne de requête en dictionnaire.

http://code.google.com/p/google-toolbox-for-mac/

Il fonctionne comme un charme

        NSDictionary * d = [NSDictionary gtm_dictionaryWithHttpArgumentsString:[[request URL] query]];

3voto

Nick Lockwood Points 23277

J'ai écrit une catégorie simple pour étendre NSString/NSURL qui vous permet d'extraire les paramètres de requête d'URL individuellement ou comme un dictionnaire de paires clé/valeur :

https://github.com/nicklockwood/RequestUtils

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X