iOS HttpUrlResponse标题字段大小写敏感度

时间:2017-06-01 19:14:20

标签: ios nsurlconnection nsurl nsurlrequest nshttpurlresponse

当尝试从HttpUrlResponse获取标头时,我发现iOS模拟器不区分大小写,而真实设备区分大小写。

  

Web服务返回HTTP标头" Grandmas-Cookies:XXXX"

当标题键包含大写字母时: urlResponse.response.allHeaderFields["Grandmas-Cookies"] as? String

  • 模拟器找不到钥匙。
  • 真实设备会看到密钥。

当标题键包含全部小写字母时: urlResponse.response.allHeaderFields["grandmas-cookies"] as? String

  • 模拟器确实找到了密钥。
  • 真实设备看不到密钥。

我可以对模拟器进行与真实设备类似的设置吗?此时不希望将Web服务中的HTTP标头更改为小写,但奇怪的是,这种情况最近才开始发生(是的,这是其中一个有趣的时间)。

1 个答案:

答案 0 :(得分:1)

编辑:

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

我创建了这个使检查用例不敏感的函数。

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,在手机设备上运行时返回false。

我修改了此StackOverflow post中的代码,以制作适用于您的方案的解决方案以及我所面临的解决方案。