Skip to content

Instantly share code, notes, and snippets.

@gillesdemey
Last active March 24, 2021 10:53
Show Gist options
  • Star 23 You must be signed in to star a gist
  • Fork 4 You must be signed in to fork a gist
  • Save gillesdemey/509bb8a1a8c576ea215a to your computer and use it in GitHub Desktop.
Save gillesdemey/509bb8a1a8c576ea215a to your computer and use it in GitHub Desktop.
Retrieve specific query string parameter from NSURL
func getQueryStringParameter(url: String, param: String) -> String? {
let url = NSURLComponents(string: url)!
return
(url.queryItems? as [NSURLQueryItem])
.filter({ (item) in item.name == param }).first?
.value()
}
@ryanio
Copy link

ryanio commented Jun 18, 2015

This is great, thanks!

@BlakeBarrett
Copy link

Thanks for posting that!
I really like your approach. Here's my riff on it:

func getQueryStringParameter(url: String?, param: String) -> String? {
    if let url = url, urlComponents = NSURLComponents(string: url), queryItems = (urlComponents.queryItems as? [NSURLQueryItem]) {
        return queryItems.filter({ (item) in item.name == param }).first?.value!
    }
    return nil
}

@corydolphin
Copy link

This is great, but it is absolutely absurd that it is so difficult to achieve such a simple and common task.

@Digiraf
Copy link

Digiraf commented Sep 10, 2015

Thanks!

@InsertNetan
Copy link

Thanks !!
if this is interesting i wrote a similar extension to achieve the same thing.

https://gist.github.com/InsertNetan/372c9f51549ea96e5af2

@hemang-azilen
Copy link

Is it available for Objective-C?

Copy link

ghost commented Jan 5, 2017

This is great, thanks! 💯

@hijohnnylin
Copy link

Thanks. For Swift 3:

func getQueryStringParameter(url: String?, param: String) -> String? {
    if let url = url, let urlComponents = URLComponents(string: url), let queryItems = (urlComponents.queryItems) {
        return queryItems.filter({ (item) in item.name == param }).first?.value!
    }
    return nil
}

@ArthurXHK
Copy link

will be better to do it with the function first(where predicate: (Element) throws -> Bool) rethrows -> Element? in Array.

func getQueryStringParameter(url: String?, param: String) -> String? {
    if let urlStr = url, let urlComponents = URLComponents(string: urlStr)?.queryItems {
        return queryItems.first(where: { $0.name == param })?.value
    }
    return nil
}

@ldrr
Copy link

ldrr commented Dec 13, 2017

And having this as an extension of URL would look like this

extension URL {
    func getQueryStringParameter(param: String) -> String? {
        guard let urlComponents = NSURLComponents(url: self, resolvingAgainstBaseURL: false),
            let queryItems = urlComponents.queryItems else {
            return nil
        }

        return queryItems.first(where: { $0.name == param })?.value
    }
}

@cerniuk
Copy link

cerniuk commented Feb 18, 2018

This is suppose to be easier than Objective C?

@TizianoCoroneo
Copy link

TizianoCoroneo commented Apr 24, 2018

why guard?

extension URL {
    func getQueryString(parameter: String) -> String? {
        return URLComponents(url: self, resolvingAgainstBaseURL: false)?
            .queryItems?
            .first { $0.name == parameter }?
            .value
    }
}

@dimitardanailov
Copy link

dimitardanailov commented Jul 11, 2018

I'm using Objective - C and Categories

Header file

#import <Foundation/Foundation.h>

@interface NSString (getQueryStringParameter)

/**
 * @method getQueryStringParameter:url:key
 * @abstract Method get specific value from NSURL
 *
 * I wrote this method follow these guides:
 * - https://gist.github.com/gillesdemey/509bb8a1a8c576ea215a
 * - https://stackoverflow.com/questions/8756683/best-way-to-parse-url-string-to-get-values-for-keys/26406426#26406426
 *
 */
+ (NSString *)getQueryStringParameter:(NSURL *)url :(NSString *)key;

@end

Implementation

#import <Foundation/Foundation.h>

#import "NSString+getQueryStringParameter.h"

@implementation NSString (Validation)

+ (NSString *)getQueryStringParameter:(NSURL *)url :(NSString *)key {
    NSURLComponents *urlComponents = [NSURLComponents componentsWithURL:url
                                                resolvingAgainstBaseURL:NO];
    NSArray *queryItems = urlComponents.queryItems;
    
    if ([queryItems count] == 0) return @"";
    
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name=%@", key];
    NSURLQueryItem *queryItem = [[queryItems
                                  filteredArrayUsingPredicate:predicate]
                                 firstObject];
    
    return queryItem.value;
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment