2016-04-21 58 views
3

我必须发送一个https GET请求到我在Swift 1.2中开发的iPhone应用程序中的Web服务。在URL中编码“&”问题

我想构建查询字符串参数,但得到编码之前发送到服务器。

当密码包含'&'字符时,所有好但不工作。预计将'&'字符编码为'%26',但不能正常工作...

刚做了'%'测试。按预期工作,'%'提供'%25'。但不能转换 '&' 的标志....

尝试以下方法:

var testPassword1: String = "mypassword&1" 

var testPassword2: String = "mypassword%1" 


// Try to encode 'testPassword1' 
testPassword1.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)! 
testPassword1.stringByAddingPercentEncodingWithAllowedCharacters(.URLHostAllowedCharacterSet())! 


// Try to encode 'testPassword2' 
testPassword2.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)! 
testPassword2.stringByAddingPercentEncodingWithAllowedCharacters(.URLHostAllowedCharacterSet())! 

我已经做了上述测试,以下是响应

enter image description here

想知道这样做的正确方法。谢谢。

+4

除了这个问题,我绝不会在GET请求中发送明文密码。 – vadian

+0

看看http://stackoverflow.com/a/31791424/1187415。 –

+1

你也应该考虑使用NSURLComponents&NSURLQueryItem。 – jtbandes

回答

3

您应该为您的任务使用NSURLComponents

给定一个URL字符串,则创建一个url-组件:

let urlString = "http://example.com" 
let urlComponents = NSURLComponents(string: urlString)! 

给定查询参数容器(可能是一个字典,或(字符串,字符串)元组的阵列?),创建NSURLQueryItems的阵列:

let queryParameters: [String: String?] = ["param": "az09-._~!$&'()*+,;=:@/?", "reserved": ":/?#[]@!$&'()*+,;="] 
var queryItems = queryParameters.map { NSURLQueryItem(name: $0.0, value: $0.1) } 

追加查询组分到URL的组件:

urlComponents.queryItems = queryItems.count > 0 ? queryItems : nil 

print(urlComponents.string!) 

p rints:

http://example.com?reserved=:/?%23%5B%[email protected]!$%26'()*+,;%3D&param=az09-._~!$%26'()*+,;%3D:@/? 
0

我用这样的实用方法URL编码在GET-请求:

@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 
+1

虽然这是“严格”(所有保留的字符将被转义),但它可能会导致URL值的问题。因此,'URLComponents'不会在查询组件中为“值”转义下列字符:'/?@!$'()* +,;'这是安全的,因为这些字符不是查询组件中的分隔符。 – CouchDeveloper

0

如果需要编码&字符,你可以使用以下命令:

var testPassword1: String = "mypassword&1" 
testPassword1.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)! 
testPassword1.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet(charactersInString: "&").invertedSet)!