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;
我在 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;