NSURL 在某些情况下返回 nil

NSURL returning nil for certain cases

我正在创建一个 NSURL 作为请求发送到 PHP rest API 我已经设置好了。下面是我的代码:

NSMutableString *url = [NSMutableString stringWithFormat:@"http://www.private.com/recievedata.php?item=%@&contact=%@&discovery=%@&summary=%@",__item,__contactDetails,__lostFound,__explain];

//The " ' " in PHP is a special character, so we have to escape it in the URL
//The two slashes are because the "\" itself is a special character in Objective C

NSString *formattedURL = [url stringByReplacingOccurrencesOfString:@"'" withString:@"\'"];

NSURLSession *session = [NSURLSession sharedSession];
NSURL *address = [NSURL URLWithString:formattedURL];

但出于某种原因,每当我尝试使以下 url 发生时,地址变量都会保持 nil

http://www.private.com/recievedata.php?item=hell\'&contact=hell&discovery=lost&summary=hell

我必须在撇号前添加“\”,这从我的代码中可以看出,因为 PHP 需要在其 URL 中转义“'”。但这样做似乎违反了 NSURL 的一些要求。大家怎么看?

你说:

I had to add "" in front of the apostrophes as is evident from my code because PHP needs to have the " ' " escaped in its URLs. But by doing so, it seems like I've violated some requirement set out for NSURL. What do you guys think?

是的,在您的 PHP 代码中,如果您在字符串值周围使用单引号,那么您必须转义出现在字符串文字中的任何 ' 个字符。

但是 不是 这种情况,您应该使用 \ 字符来转义出现在您试图传递的值中的 ' 字符在您的请求的 URL 中。 (也不应该在 POST 请求的正文中这样做。)

并且如果您因为要将这些值插入 SQL 语句而想要转义这些 ' 字符,则不应手动转义它们。相反,您应该调用 mysqli_real_escape_string 或将值显式绑定到 SQL 中的 ? 占位符。永远不要依赖客户端代码来转义这些值(因为你仍然容易受到 SQL 注入攻击)。

回到 URL 中保留字符的编码,这是由 RFC 3986 管理的。谨慎的策略是对非保留字符集中的字符以外的任何字符进行百分比转义。值得注意的是,如果您的值可能包含 &+ 个字符,则转义百分比至关重要。

因此,URL 查询值中 ' 字符的正确编码不是 \',而是 %27。不幸的是,stringByAddingPercentEscapesUsingEncoding 编码 还不够 (因为它会让某些关键字符在值字符串中未转义)。

历史上,我们使用 CFURLCreateStringByAddingPercentEscapes 来百分比转义值(有关可能的字符集的说明,请参阅 Urlencode in Objective-C). The stringByAddingPercentEncodingWithAllowedCharacters, introduced in Mac OS 10.9 and iOS 7, can work, too (see )。