Подтвердить что ты не робот

Url минус строка запроса в Objective-C

Какой лучший способ получить URL-адрес минус строку запроса в Objective-C? Пример:

Input:

http://www.example.com/folder/page.htm?param1=value1&param2=value2

Вывод:

http://www.example.com/folder/page.htm

Есть ли способ NSURL для этого, который мне не хватает?

4b9b3361

Ответ 1

Нет никакого метода NSURL, который я могу видеть. Вы можете попробовать что-то вроде:

NSURL *newURL = [[NSURL alloc] initWithScheme:[url scheme]
                                         host:[url host]
                                         path:[url path]];

Тестирование выглядит хорошо:

#import <Foundation/Foundation.h>
int main(int argc, char *argv[]) {
    NSAutoreleasePool *arp = [[NSAutoreleasePool alloc] init];

    NSURL *url = [NSURL URLWithString:@"http://www.abc.com/foo/bar.cgi?a=1&b=2"];
    NSURL *newURL = [[[NSURL alloc] initWithScheme:[url scheme]
                                              host:[url host]
                                              path:[url path]] autorelease];
    NSLog(@"\n%@ --> %@", url, newURL);
    [arp release];
    return 0;
}

Запуск этого процесса:

$ gcc -lobjc -framework Foundation -std=c99 test.m ; ./a.out 
2010-11-25 09:20:32.189 a.out[36068:903] 
http://www.abc.com/foo/bar.cgi?a=1&b=2 --> http://www.abc.com/foo/bar.cgi

Ответ 2

Так как iOS 8/OS X 10.9, это более простой способ сделать это с помощью NSURLComponents.

NSURL *url = [NSURL URLWithString:@"http://hostname.com/path?key=value"];
NSURLComponents *urlComponents = [[NSURLComponents alloc] initWithURL:url resolvingAgainstBaseURL:NO];

urlComponents.query = nil; // Strip out query parameters.
NSLog(@"Result: %@", urlComponents.string); // Should print http://hostname.com/path

Ответ 3

Вот версия Swift Andree, с некоторым дополнительным вкусом -

extension NSURL {

    func absoluteStringByTrimmingQuery() -> String? {
        if let urlcomponents = NSURLComponents(URL: self, resolvingAgainstBaseURL: false) {
            urlcomponents.query = nil
            return urlcomponents.string
        }
        return nil
    }
}

Вы можете называть его так:

let urlMinusQueryString  = url.absoluteStringByTrimmingQuery()

Ответ 4

Вы можете попробовать использовать query of NSURL, чтобы получить параметры, затем разделите это значение с помощью stringByReplacingOccurrencesOfString NSString?

NSURL *before = [NSURL URLWithString:@"http://www.example.com/folder/page.htm?param1=value1&param2=value2"];
NSString *after = [before.absoluteString stringByReplacingOccurrencesOfString:before.query withString:@""];

Обратите внимание, что конечный URL-адрес по-прежнему заканчивается символом?, но вы также можете легко удалить его, если это необходимо.

Ответ 5

Возможно, вам нужна комбинация компонентов хоста и пути URL:

NSString *result = [[url host] stringByAppendingPathComponent:[url path]];

Ответ 6

NSURL имеет свойство query, которое содержит все после ? в URL-адресе GET. Поэтому просто вычтите это из конца absoluteString, и у вас есть url без запроса.

NSURL *originalURL = [NSURL URLWithString:@"https://[email protected]:1000/file/path/?q=dogfood"];
NSString *strippedString = [originalURL absoluteString];
NSUInteger queryLength = [[originalURL query] length];
strippedString = (queryLength ? [strippedString substringToIndex:[strippedString length] - (queryLength + 1)] : strippedString);
NSLog(@"Output: %@", strippedString);

Logs:

Output: https://[email protected]:1000/file/path/

+1 для ?, который не является частью query.

Ответ 7

Я думаю, что -baseURL может делать то, что вы хотите.

Если нет, вы можете совершить кругосветное путешествие через NSString так:

NSString *string = [myURL absoluteString];
NSString base = [[string componentsSeparatedByString:@"?"] objectAtIndex:0];
NSURL *trimmed = [NSURL URLWithString:base];

Ответ 8

Вы можете представить метод replaceOccurrencesOfString:withString:options:range: класса NSMutableString. Я решил это, написав category для NSURL:

#import <Foundation/Foundation.h>

@interface NSURL (StripQuery)
// Returns a new URL with the query stripped out.
// Note: If there is no query, returns a copy of this URL.
- (NSURL *)URLByStrippingQuery;
@end

@implementation NSURL (StripQuery)
- (NSURL *)URLByStrippingQuery
{
    NSString *query = [self query];
    // Simply copy if there was no query. (query is nil if URL has no '?',
    // and equal to @"" if it has a '?' but no query after.)
    if (!query || ![query length]) {
        return [self copy];
    }
    NSMutableString *urlString = [NSMutableString stringWithString:[self absoluteString]];
    [urlString replaceOccurrencesOfString:query
                               withString:@""
                                  options:NSBackwardsSearch
                                    range:NSMakeRange(0, [urlString length])];
    return [NSURL URLWithString:urlString];
}
@end

Таким образом, я могу отправить это сообщение существующим объектам NSURL и вернуть мне новый объект NSURL.

Я протестировал его с помощью этого кода:

int main(int argc, const char * argv[])
{
    @autoreleasepool {
        NSURL *url = [NSURL URLWithString:@"http://www.example.com/script.php?key1=val1&key2=val2"];
//      NSURL *url = [NSURL URLWithString:@"http://www.example.com/script.php?"];
//      NSURL *url = [NSURL URLWithString:@"http://www.example.com/script.php"];
        NSURL *newURL = [url URLByStrippingQuery];
        NSLog(@"Original URL: \"%@\"\n", [url absoluteString]);
        NSLog(@"Stripped URL: \"%@\"\n", [newURL absoluteString]);
    }
    return 0;
}

и я получил следующий результат (минус отметки времени):

Original URL: "http://www.example.com/script.php?key1=val1&key2=val2"
Stripped URL: "http://www.example.com/script.php?"

Обратите внимание, что вопросительный знак ('?') остается. Я оставлю его читателю, чтобы удалить его безопасным способом.

Ответ 9

Swift 3.0

extension URL {

    func absoluteStringByTrimmingQuery() -> String? {
        if var urlcomponents = URLComponents(url: self, resolvingAgainstBaseURL: false) {
            urlcomponents.query = nil
            return urlcomponents.string
        }
        return nil
    }
}

Ответ 10

Я думаю, что вы ищете baseUrl.