php - 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)
}
})
解决方案
我发现只有当您访问 php 服务器时才会出现此问题。当从 Swift 进行调用时,php Web 服务器会查找一些标头并找不到它。我什至从 Postman 复制了工作代码,结果是一样的。
我采用的解决方案是使用 firebase 云功能创建代理服务器。Swift 代码会命中一个与 php 对话并将响应发送给 swift 的 firebase 云函数。
推荐阅读
- mysql - 通过将价格与其他元值相乘来使用 MySQL 更新 woocommerce 产品价格
- angular - ngx-toastr 内存泄漏超时
- javascript - 如何在没有 webpack-dev-server 的情况下运行 webpack 项目?
- anylogic - Anylogic行人在特定时间到达
- c# - System.ArgumentNullException:值不能在 System.Linq.Enumerable.Any 为空
- c++ - 虚幻引擎和 Clion(无法获取编译器信息)
- css - 在类星体中设置不覆盖卡片的背景图像
- assembly - 如何比较汇编中的两个字符串?
- python - python关键字匹配(关键字列表-列)
- git - Gitlab SSH https 不同内容