【问题标题】:NSURL returning nil for certain casesNSURL 在某些情况下返回 nil
【发布时间】:2015-08-03 21:52:00
【问题描述】:

我正在创建一个 NSURL 作为请求发送给我已经设置好的 PHP 休息 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];

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

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

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

【问题讨论】:

  • 不要转义引号,而是使用 stringByAddingPercentEscapesUsingEncoding: 正确编码 URL 中的特殊字符。
  • @rmaddy 我应该输入什么编码类型?
  • 很可能是NSUTF8StringEncoding,但这取决于服务器的期望。
  • @rmaddy 不工作,我的 url 需要这样的东西: \' 用于 PHP 的目的,但在 NSURLs 中不允许反冲。我该如何解决这个问题?
  • 顺便说一句,我注意到您正在构建 GET 请求,并将所有这些参数添加到 URL。您可以考虑使用 POST 请求(看起来您实际上是在发送数据)并将这些参数放在请求的正文中而不是 URL 中。

标签: objective-c nsurl nsurlsession


【解决方案1】:

你说:

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

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

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

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

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

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

过去,我们会使用CFURLCreateStringByAddingPercentEscapes 来百分比转义值(请参阅Urlencode in Objective-C)。在 Mac OS 10.9 和 iOS 7 中引入的 stringByAddingPercentEncodingWithAllowedCharacters 也可以工作(有关可能的字符集的说明,请参阅 https://stackoverflow.com/a/24888789/1271826)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-08
    • 1970-01-01
    • 2015-07-30
    • 2019-12-27
    • 2010-12-31
    • 2019-02-16
    • 1970-01-01
    相关资源
    最近更新 更多