Ios “编码问题”&&引用;在URL中

Ios “编码问题”&&引用;在URL中,ios,swift,nsurl,Ios,Swift,Nsurl,我必须在我的iPhone应用程序中向web服务发送https GET请求,该应用程序正在Swift 1.2中开发 我试图构造查询字符串参数,但在发送到服务器之前必须对它们进行编码 密码包含“&”字符时,一切正常但不工作。预期将“&”字符编码为“%26”,但不起作用 刚在使用“%”时进行了测试。与提供“%25”的“%”一起正常工作。但不能转换“&”符号 尝试了以下方法: var testPassword1: String = "mypassword&1" var testPassword

我必须在我的iPhone应用程序中向web服务发送https GET请求,该应用程序正在Swift 1.2中开发

我试图构造查询字符串参数,但在发送到服务器之前必须对它们进行编码

密码包含“&”字符时,一切正常但不工作。预期将“&”字符编码为“%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())!
我已经做了上面的测试,下面是回应

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

您应该使用它来完成任务

给定URL字符串,创建URL组件:

let urlString = "http://example.com"
let urlComponents = NSURLComponents(string: urlString)!
urlComponents.queryItems = queryItems.count > 0 ? queryItems : nil

print(urlComponents.string!)
给定一个查询参数容器(可能是一个字典或一个(String,String?)元组数组),创建一个NSURLQueryItems数组:

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

let urlString = "http://example.com"
let urlComponents = NSURLComponents(string: urlString)!
urlComponents.queryItems = queryItems.count > 0 ? queryItems : nil

print(urlComponents.string!)
印刷品:

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

我在GET请求中使用了这样一种实用方法对值进行URL编码:

@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

如果需要对字符进行编码(&C),可以使用以下方法:

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

除了这个问题,我不会在GET请求中发送明文密码。请看一下。你还应该考虑使用NSull组件和NSurLQuyItI.Hi-VADIN,这就是API所说的,它通过HTTPS进行通信…谢谢JTBANTES。您能提供一个例子吗?虽然这是“严格的”(所有保留字符都将被转义),但它可能会导致URL值出现问题。因此,
URLComponents
不会为查询组件中的“值”转义以下字符:
/?@!$'()*+,;这是安全的,因为这些字符不是查询组件中的分隔符。