Issue with encoding “&” in URLs

后端 未结 3 705
挽巷
挽巷 2021-01-20 01:21

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

相关标签:
3条回答
  • 2021-01-20 01:36

    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)!
    
    0 讨论(0)
  • 2021-01-20 01:55

    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
    
    0 讨论(0)
  • 2021-01-20 02:00

    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&param=az09-._~!$%26'()*+,;%3D:@/?
    
    0 讨论(0)
提交回复
热议问题