这是函数,在邮递员中,当我输入Accept-Language“en”时,它会得到英文数据,但我的代码却没有,为什么
func fetchDataByToken<T: Decodable>(urlString: String, type: T.Type) -> AnyPublisher<T, APIError> {
guard let token = UserManager.shared.getToken() else {
return Fail(error: APIError.serverError)
.eraseToAnyPublisher()
}
guard let url = URL(string: urlString) else {
return Fail(error: APIError.invalidURL)
.eraseToAnyPublisher()
}
var request = URLRequest(url: url)
request.httpMethod = "GET"
request.setValue("en", forHTTPHeaderField: "Accept-Language")
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
request.setValue("Bearer \(token)", forHTTPHeaderField: "Authorization")
return URLSession.shared.dataTaskPublisher(for: request)
.tryMap { output -> Data in
guard let response = output.response as? HTTPURLResponse,
response.statusCode >= 200 && response.statusCode < 300 else {
throw APIError.invalidData
}
return output.data
}
.decode(type: T.self, decoder: JSONDecoder())
.mapError { _ in
APIError.invalidData
}
.eraseToAnyPublisher()
}
我希望数据是英文的
您从应用程序发送的 URL 请求与通过 Postman 发送的 URL 请求之间可能不匹配。您可以使用 Xcode 中的网络工具(仅在真实设备上,而不是模拟器上)来查看发出的确切请求。请参阅文档: https://developer.apple.com/documentation/foundation/url_loading_system/analyzing_http_traffic_with_instruments。
我个人更喜欢使用 Proxyman 进行此类网络跟踪,因为我可以捕获和分析任何设备上的流量,而无需将 Xcode 会话连接到该设备。请参阅https://proxyman.io。
另外,如果有任何方法可以改变它,我建议您使用 async/await 而不是合并。根据我的经验,Combine 很难阅读,很难调试,也很难编写测试;它似乎已被降级,并且大多数新代码在可能的情况下使用 async/await 代替。