67 votes

Objective-C: Comment ajouter un paramètre de requête à NSURL?

Disons que j'ai un NSURL ? Que ce soit ou non déjà une chaîne de requête vide, comment puis-je ajouter un ou plusieurs paramètres au query du NSURL ? C'est à dire, est-ce que quelqu'un est au courant d'une implémentation de cette fonction?

 - (NSURL *)URLByAppendingQueryString:(NSString *)queryString
 

Pour qu'il satisfasse ce fichier NSURL+AdditionsSpec.h :

 #import "NSURL+Additions.h"
#import "Kiwi.h"

SPEC_BEGIN(NSURL_AdditionsSpec)

describe(@"NSURL+Additions", ^{
    __block NSURL *aURL;

    beforeEach(^{
        aURL = [[NSURL alloc] initWithString:@"http://www.example.com"];
        aURLWithQuery = [[NSURL alloc] initWithString:@"http://www.example.com?key=value"];
    });

    afterEach(^{
        [aURL release];
        [aURLWithQuery release];
    });

    describe(@"-URLByAppendingQueryString:", ^{
        it(@"adds to plain URL", ^{
            [[[[aURL URLByAppendingQueryString:@"key=value&key2=value2"] query] should]
             equal:@"key=value&key2=value2"];
        });

        it(@"appends to the existing query sting", ^{
            [[[[aURLWithQuery URLByAppendingQueryString:@"key2=value2&key3=value3"] query] should]
             equal:@"key=value&key2=value2&key3=value3"];
        });
    });
});

SPEC_END
 

76voto

Salmo Points 494

Avec iOS7, vous pouvez utiliser NSURLComponents, maintenant c'est très simple, regardez ces exemples:

Exemple 1

 NSString *urlString = @"https://mail.google.com/mail/u/0/?shva=1#inbox";
NSURLComponents *components = [[NSURLComponents alloc] initWithString:urlString];

NSLog(@"%@ - %@ - %@ - %@", components.scheme, components.host, components.query, components.fragment);
 

Exemple 2

 NSString *urlString = @"https://mail.google.com/mail/u/0/?shva=1#inbox";
NSURLComponents *components = [[NSURLComponents alloc] initWithString:urlString];

if (components) {
    //good URL
} else {
    //bad URL
}
 

// exemple 3

 NSURLComponents *components = [NSURLComponents new];
[components setScheme:@"https"];
[components setHost:@"mail.google.com"];
[components setQuery:@"shva=1"];
[components setFragment:@"inbox"];
[components setPath:@"/mail/u/0/"];

[self.webview loadRequest:[[NSURLRequest alloc] initWithURL:[components URL]]];
 

Mais vous pouvez faire beaucoup d'autres choses avec NSURLComponents, regardez sur NSURLComponents.h ou ce lien: http://nshipster.com/nsurl/

46voto

MattDiPasquale Points 23842

Voici une implémentation qui réponde à vos spécifications:

 @implementation NSURL (Additions)

- (NSURL *)URLByAppendingQueryString:(NSString *)queryString {
    if (![queryString length]) {
        return self;
    }

    NSString *URLString = [[NSString alloc] initWithFormat:@"%@%@%@", [self absoluteString],
                           [self query] ? @"&" : @"?", queryString];
    NSURL *theURL = [NSURL URLWithString:URLString];
    [URLString release];
    return theURL;
}

@end
 

Et voici une implémentation pour NSString :

 @implementation NSString (Additions)

- (NSURL *)URLByAppendingQueryString:(NSString *)queryString {
    if (![queryString length]) {
        return [NSURL URLWithString:self];
    }

    NSString *URLString = [[NSString alloc] initWithFormat:@"%@%@%@", self,
                           [self rangeOfString:@"?"].length > 0 ? @"&" : @"?", queryString];
    NSURL *theURL = [NSURL URLWithString:URLString];
    [URLString release];
    return theURL;
}

// Or:

- (NSString *)URLStringByAppendingQueryString:(NSString *)queryString {
    if (![queryString length]) {
        return self;
    }
    return [NSString stringWithFormat:@"%@%@%@", self,
            [self rangeOfString:@"?"].length > 0 ? @"&" : @"?", queryString];
}

@end
 

5voto

drewish Points 2114

Si vous utilisez RestKit, il fournit des ajouts à NSString . L'un d'entre eux est:

 - (NSString *)stringByAppendingQueryParameters:(NSDictionary *)queryParameters
 

Alors tu pourrais faire:

 NSDictionary *shopParams = [NSDictionary dictionaryWithKeysAndObjects:
                                @"limit",@"20", 
                                @"location",@"latitude,longitude",
                                nil];
NSString *pathWithQuery = [@"/api/v1/shops.json" stringByAppendingQueryParameters:shopParams]
 

1voto

Roger Nolan Points 10248

NSURL n'est pas modifiable, vous ne pouvez donc pas implémenter cette fonctionnalité directement basée sur NSURL. Au lieu de cela, vous devrez obtenir la représentation sous forme de chaîne de l'URL, y ajouter vos paramètres, puis créer un nouveau NSURL.

Cela ne semble pas être une bonne solution. À moins d'une bonne raison, il est préférable de travailler avec les chaînes jusqu'au dernier moment et de créer un NSURL uniquement lorsque votre demande est entièrement formée.

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