iOS HttpUrlResponse头字段大小写敏感性

问题描述:

当试图从HttpUrlResponse获取头文件时,我发现iOS模拟器不区分大小写,而真实设备区分大小写。iOS HttpUrlResponse头字段大小写敏感性

的web服务,返回的HTTP标头 “奶奶,饼干:XXXX”

当标题密钥具有大写字母urlResponse.response.allHeaderFields["Grandmas-Cookies"] as? String

  • 模拟器未找到键。
  • 真正的设备看到了关键。

当标题密钥具有全小写字母urlResponse.response.allHeaderFields["grandmas-cookies"] as? String

  • 模拟器确实找到问题的关键。
  • 真实的设备没有看到密钥。

是否有一个设置可以让模拟器的行为与真实设备类似?现在将Web服务中的HTTP标题更改为小写是不可取的,但最近才发生这种情况很奇怪(是的,这是有趣的时刻之一)。

+0

如果你还没有,提交一个错误。所有标题字段查找都应该是不区分大小写的。 – dgatwood

编辑:

@亚当我找到了一个更好的方法来确保这不是问题。

我创建了这个函数,使检查大小写不敏感。

func find(header: String) -> String? { 
     let keyValues = allHeaderFields.map { (String(describing: $0.key).lowercased(), String(describing: $0.value)) } 

     if let headerValue = keyValues.filter({ $0.0 == header.lowercased() }).first { 
      return headerValue.1 
     } 
     return nil 
    } 

以下可能对某些人仍然有用。

为了解决这个问题,我创建了一个struct。在struct内部,我创建了一个静态变量grandmasCookies,现在可以在应用程序中的任何位置引用它。这将返回大写

奶奶的饼干

当您在手机设备上运行。

这将返回小写

奶奶饼干

,当你在一个设备上的模拟器,如MacBook Pro的运行。

struct Platform { 

    static let grandmasCookies: String = { 
     var xtoken = "Grandmas-Cookies" 
     #if arch(i386) || arch(x86_64) 
      xtoken = "grandmas-cookies" 
     #endif 
     return xtoken 
    }() 

    static let isSimulator: Bool = { 
     var isSim = false 
     #if arch(i386) || arch(x86_64) 
      isSim = true 
     #endif 
     return isSim 
    }() 
} 

我创建了一个第二方便可变isSimulator从模拟器运行和假电话设备上运行时,时返回true。

我调整了这个StackOverflow代码post的代码,以便为您的方案和我所面对的问题制定一个解决方案。

+1

RFC明确规定“每个头域包含一个名称,后跟一个冒号(”:“)和字段值,字段名称不区分大小写。”所以我对这个解决方案并不是100%满意,但现在可以工作。 https://tools.ietf.org/html/rfc2616#section-4.2 – Adam