首页 > 解决方案 > Swift HTTP 请求问题(不发送 HOST 标头)

问题描述

我有一个基于 PHP 构建的简单休息端点,适用于邮递员和浏览器。

https://someserver.com/api/endpoint.php?name=hello

但是当从 Swift 调用时,代码无法执行。经过调查,我发现 Postman 和 Browser 发送 Host Header 而 Swift URLRequest 没有。当您不发送 HOST 标头时,php 服务器拒绝接受传入的请求,我相信该请求在 Web 服务器级别被拒绝。我尝试使用

request.addValue("127.0.0.1", "Host")

但它仍然没有工作。任何帮助表示赞赏。

完整代码 (Swift 4)

let url = urlInput.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)!
        print("URL is: " + url)
        var request = URLRequest(url: URL(string: url)!)
        request.httpMethod = "GET"
            request.addValue(<#T##value: String##String#>, forHTTPHeaderField: <#T##String#>)
        let session = URLSession.shared
        let task = session.dataTask(with: request, completionHandler: { data, response, error -> Void in
            if let httpResponse = response as? HTTPURLResponse {
                
                let respStr = String(data: data!, encoding: String.Encoding.utf8) as String?
                print ("Response is \(respStr ?? "")")
                print("statusCode: \(httpResponse.statusCode)")
                
                let data: Data? = respStr?.data(using: .utf8)
}
})

标签: phpswiftapachehttp

解决方案


我发现只有当您访问 php 服务器时才会出现此问题。当从 Swift 进行调用时,php Web 服务器会查找一些标头并找不到它。我什至从 Postman 复制了工作代码,结果是一样的。

我采用的解决方案是使用 firebase 云功能创建代理服务器。Swift 代码会命中一个与 php 对话并将响应发送给 swift 的 firebase 云函数。


推荐阅读