I\'ve got to send a https GET request to a web service in my iPhone app which is developing in Swift 1.2.
I am trying to construct query string parameters but got to
If you need to encode the & character, you can use the following:
var testPassword1: String = "mypassword&1"
testPassword1.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)!
testPassword1.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet(charactersInString: "&").invertedSet)!
I used such an utility method to URL-encode values in GET-requests:
@interface NSString (Ext)
@property (nonatomic, readonly) NSString *urlEncoded;
@end
@implementation NSString (Ext)
- (NSString *)urlEncoded {
NSMutableCharacterSet *const allowedCharacterSet = [NSCharacterSet URLQueryAllowedCharacterSet].mutableCopy;
// See https://en.wikipedia.org/wiki/Percent-encoding
[allowedCharacterSet removeCharactersInString:@"!*'();:@&=+$,/?#[]"]; // RFC 3986 section 2.2 Reserved Characters (January 2005)
NSString *const urlEncoded = [self stringByAddingPercentEncodingWithAllowedCharacters:allowedCharacterSet];
return urlEncoded;
}
@end
You should use NSURLComponents for your task.
Given a URL string, create a url-components:
let urlString = "http://example.com"
let urlComponents = NSURLComponents(string: urlString)!
Given a query parameter container (possibly a dictionary, or an array of (String, String?) tuple), create an array of NSURLQueryItems:
let queryParameters: [String: String?] = ["param": "az09-._~!$&'()*+,;=:@/?", "reserved": ":/?#[]@!$&'()*+,;="]
var queryItems = queryParameters.map { NSURLQueryItem(name: $0.0, value: $0.1) }
Append the query-component to the url-components:
urlComponents.queryItems = queryItems.count > 0 ? queryItems : nil
print(urlComponents.string!)
prints:
http://example.com?reserved=:/?%23%5B%5D@!$%26'()*+,;%3D¶m=az09-._~!$%26'()*+,;%3D:@/?