Swift URLRequest未发送Host Header请求PHP接口失败如何解决?
问题解决思路
- 核心原因1:苹果的
URLSession为了保证请求合法性,默认会自动根据请求URL的域名生成Host请求头,手动给单个URLRequest添加的Host头会被系统覆盖,无法生效。 - 核心原因2:你之前添加Host头的代码本身缺少
forHTTPHeaderField参数标签,存在语法错误,也会导致设置失败。 - 核心原因3:你贴出的代码缺少请求启动方法,请求根本不会发出。
具体修复步骤
1. 修正Host头取值
你当前设置的Host值为127.0.0.1,与你的接口域名someserver.com不匹配,就算请求头发送成功,服务端的虚拟主机配置也会拦截请求,正确的Host值应该和接口域名保持一致:someserver.com。
2. 正确配置自定义Host头
如果确实需要强制自定义Host头,需要通过URLSessionConfiguration的全局请求头配置,避免被系统覆盖,完整可运行代码如下:
// 先构造正确的URL,避免强制解包崩溃 guard let url = URL(string: "https://someserver.com/api/endpoint.php?name=hello") else { print("URL构造失败") return } print("URL is: " + url.absoluteString) // 配置session,全局设置Host头,不会被系统覆盖 let config = URLSessionConfiguration.default config.httpAdditionalHeaders = ["Host": "someserver.com"] let session = URLSession(configuration: config) var request = URLRequest(url: url) request.httpMethod = "GET" let task = session.dataTask(with: request, completionHandler: { data, response, error -> Void in // 先处理请求错误 if let error = error { print("请求出错: \(error.localizedDescription)") return } guard let data = data, let httpResponse = response as? HTTPURLResponse else { print("响应为空") return } let respStr = String(data: data, encoding: .utf8) print ("Response is \(respStr ?? "")") print("statusCode: \(httpResponse.statusCode)") }) task.resume() // 必须调用resume才会启动请求,你原有代码漏了这行
3. 简化方案(无需手动设置Host头)
如果你的接口本身可以通过公网域名正常访问,不需要手动设置Host头,URLSession会自动生成符合要求的Host头,只需要保证URL构造正确、调用resume()启动任务即可正常请求。
内容的提问来源于stack exchange,提问作者touchydeer36
相关产品推荐
相关产品推荐

