iOS NSURL returning nil on valid URL

o0omycomputero0o

I've entered the URL http://localhost:8080/a?a=1\\tb?b=2 on the Safari it worked as expected but when using NSURL URLWithString it return nil. (The server also require \t character)

NSURL *url = [NSURL URLWithString:@"http://localhost:8080/a?a=1\\tb?b=2"];
Rob

The problem is that you need to percent-encode your values in the URL string. When it’s received by the server, it will decode this percent-encoded string in the URL into the desired value.

But rather than percent-encoding yourself, you can use NSURLComponents. For example, if you want a to have the value of @"1\\tb", you can do:

NSURLComponents *components = [NSURLComponents componentsWithString:@"http://localhost:8080"];
components.queryItems = @[
    [NSURLQueryItem queryItemWithName:@"a" value:@"1\\tb"],
    [NSURLQueryItem queryItemWithName:@"b" value:@"2"]
];
NSURL *url = components.URL;

Yielding:

http://localhost:8080?a=1%5Ctb&b=2

Or, if you wanted it to have the tab character in the value associated with a (i.e. %09):

NSURLComponents *components = [NSURLComponents componentsWithString:@"http://localhost:8080"];
components.queryItems = @[
    [NSURLQueryItem queryItemWithName:@"a" value:@"1\tb"],
    [NSURLQueryItem queryItemWithName:@"b" value:@"2"]
];
NSURL *url = components.URL;

Yielding:

http://localhost:8080?a=1%09b&b=2

It just depends upon whether your server is expecting two characters, the \ followed by t (the first example) or the single \t character (the second example). Either way, the respective use of NSURLComponents will take care of the percent-encoding for you, and your server will decode it.


For what it’s worth, the one caveat is the + character, which NSURLComponents won’t percent-encode for you (because, technically, a + character is allowed in a URL query). The problem is that the + character is interpreted as a space character by most web servers (per the x-www-form-urlencoded spec). If you need to pass a literal + character, you might want to replace those + characters, as advised by Apple:

NSURLComponents *components = [NSURLComponents componentsWithString:@"http://localhost:8080"];
components.queryItems = @[
    [NSURLQueryItem queryItemWithName:@"q" value:@"Romeo+Juliet"]
];
components.percentEncodedQuery = [components.percentEncodedQuery stringByReplacingOccurrencesOfString:@"+" withString:@"%2B"];
NSURL *url = components.URL;

Collected from the Internet

Please contact [email protected] to delete if infringement.

edited at
0

Comments

0 comments
Login to comment

Related