iOS NSURL 在有效 URL 时返回 nil

iOS NSURL returning nil on valid URL

我在 Safari 上输入了 URL http://localhost:8080/a?a=1\tb?b=2 它按预期工作但是当使用 NSURL URLWithString 时它 return 没有。 (服务器还需要\t个字符)

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

问题是您需要对 URL 字符串中的值进行百分比编码。当它被服务器接收到时,它会将 URL 中的这个百分比编码的字符串解码为所需的值。

但是您可以使用 NSURLComponents 而不是自己进行百分比编码。比如你想让a的值为@"1\tb",你可以这样做:

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

产量:

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

或者,如果您希望它在与 a(即 %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;

产量:

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

这取决于您的服务器是否需要两个字符,\ 后跟 t(第一个示例)或单个 \t 字符(第二个示例)。无论哪种方式,NSURLComponents 的各自使用将为您处理百分比编码,您的服务器将对其进行解码。


就其价值而言,需要注意的是 + 字符,NSURLComponents 不会为您进行百分比编码(因为从技术上讲,+ 字符是允许的在 URL 查询中)。问题是 + 字符被大多数 Web 服务器解释为 space 字符(根据 x-www-form-urlencoded spec)。如果您需要传递文字 + 字符,您可能需要按照 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;