首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Objective-C:如何向NSURL添加查询参数?

Objective-C:如何向NSURL添加查询参数?
EN

Stack Overflow用户
提问于 2011-06-11 01:00:31
回答 6查看 61.3K关注 0票数 64

假设我有一个NSURL?无论它是否已经有一个空的查询字符串,如何向NSURLquery添加一个或多个参数?也就是说,有没有人知道这个函数的实现?

代码语言:javascript
复制
- (NSURL *)URLByAppendingQueryString:(NSString *)queryString

这样它就可以满足这个NSURL+AdditionsSpec.h文件:

代码语言:javascript
复制
#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
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2017-05-18 15:59:46

正如其他人所提到的,您可以使用NSURLComponents来构造URL。

代码语言:javascript
复制
@implementation NSURL (Additions)

- (NSURL *)URLByAppendingQueryParameters:(NSDictionary *)queryParameters
{        
    NSURLComponents *components = [[NSURLComponents alloc] initWithURL:self resolvingAgainstBaseURL:NO];
    NSMutableArray *queryItems = [NSMutableArray array:components.queryItems];
    for (NSString *key in [queryParameters allKeys]) {
        NSURLQueryItem *queryItem = [[NSURLQueryItem alloc] initWithName:key value:queryParameters[key]];
        [queryItems addObject:queryItem];
    }
    components.queryItems = queryItems;
    return [components URL];
}

@end
票数 1
EN

Stack Overflow用户

发布于 2011-06-11 05:16:06

下面是一个实现,它通过了您的规范:

代码语言:javascript
复制
@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

下面是NSString的一个实现

代码语言:javascript
复制
@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
票数 46
EN

Stack Overflow用户

发布于 2015-11-06 17:05:26

对于那些不想在用NSURLComponents构建NSURL时编写样板代码的人来说,这只是一个友好的帖子。

自从iOS8以来,我们有了NSURLQueryItem,它可以帮助我们快速构建URL请求。

我写了一个方便的类别来简化工作,你可以在这里获取:URLQueryBuilder

下面的示例说明了使用它是多么容易:

代码语言:javascript
复制
NSString *baseURL = @"https://google.com/search";
NSDictionary *items = @{
    @"q"  : @"arsenkin.com",
    @"hl" : @"en_US",
    @"lr" : @"lang_en"
};

NSURL *URL = [NSURL ars_queryWithString:baseURL queryElements:items];  
// https://google.com/search?q=arsenkin.com&hl=en_US&lr=lang_en
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6309698

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档