Swift:如何使用HTTPS代理
我有一个付费代理(HTTP/HTTPS/SOCKS)。 我可以使用HTTP方案发出请求,但不能使用HTTPS 我总是犯错误:Swift:如何使用HTTPS代理,swift,xcode,proxy,urlsession,Swift,Xcode,Proxy,Urlsession,我有一个付费代理(HTTP/HTTPS/SOCKS)。 我可以使用HTTP方案发出请求,但不能使用HTTPS 我总是犯错误: Error Domain=kCFErrorDomainCFNetwork Code=311 "(null)" UserInfo={_NSURLErrorFailingURLSessionTaskErrorKey=LocalDataTask <69F444DF-8C0E-4F4B-B723-C7BCD72B6C02>.<1>, _
Error Domain=kCFErrorDomainCFNetwork Code=311 "(null)" UserInfo={_NSURLErrorFailingURLSessionTaskErrorKey=LocalDataTask <69F444DF-8C0E-4F4B-B723-C7BCD72B6C02>.<1>, _kCFStreamErrorDomainKey=4, _NSURLErrorRelatedURLSessionTaskErrorKey=(
"LocalDataTask <69F444DF-8C0E-4F4B-B723-C7BCD72B6C02>.<1>"
), _kCFStreamErrorCodeKey=-2097}
请求功能:
private func getProxySessionConfigration() -> URLSessionConfiguration {
let login = ConfigurationData.proxy.login
let password = ConfigurationData.proxy.password
let sessionConfiguration = URLSessionConfiguration.default
let userPasswordString = "\(login):\(password)"
let userPasswordData = userPasswordString.data(using: String.Encoding.utf8)
let base64EncodedCredential = userPasswordData!.base64EncodedString(options: Data.Base64EncodingOptions(rawValue: 0))
let authString = "Basic \(base64EncodedCredential)"
sessionConfiguration.httpAdditionalHeaders = ["Authorization" : authString]
sessionConfiguration.connectionProxyDictionary = [
"HTTPEnable": true,
"HTTPPort": ConfigurationData.proxy.port,
"HTTPProxy": ConfigurationData.proxy.host,
"HTTPSEnable": true,
"HTTPSPort": ConfigurationData.proxy.port,
"HTTPSProxy": ConfigurationData.proxy.host
]
return sessionConfiguration
}
public func getPage(_ url: URL, completion: @escaping (String?, RequestError?) -> Void) {
let session = URLSession(configuration: getProxySessionConfigration())
let task = session.dataTask(with: url) { (data, response, error) in
guard let httpResponse = response as? HTTPURLResponse,
(200...299).contains(httpResponse.statusCode) else {
if let error = error {
completion(nil, .requestFailed(error))
} else {
completion(nil, .unknown(response))
}
return
}
if let data = data {
print(httpResponse)
if let urlContent = NSString(data: data, encoding: String.Encoding.utf8.self.rawValue) {
completion(urlContent as String, nil)
} else {
completion(nil, .dataDecodeFailed(data))
}
} else {
completion(nil, .noData)
}
}
task.resume()
}
let requestAvito = AvitoProjectPlaygroud_Sources.RequestAvito()
let url = URL(string: "https://www.avito.ru/krasnodar/vakansii/voditel_v_yandeks_taksi_zarabotok_ot_1388074044")!
requestAvito.getPage(url) { (htmlString, error) in
if let error = error {
switch error {
case .noData: print("ERROR: no data")
case .unknown(let response):
print("ERROR: unknown error")
if let response = response { print(response) }
case .urlFailed: print("ERROR: url generating failed")
case .requestFailed(let returnedError): print("ERROR: \(returnedError)")
case .dataDecodeFailed(let data):
print("ERROR: data decoding failed")
print(data!)
}
return
}
if let htmlString = htmlString {
// print(htmlString)
print(String(htmlEncodedString: htmlString))
} else {
print("NO DATA")
}
}
函数调用:
private func getProxySessionConfigration() -> URLSessionConfiguration {
let login = ConfigurationData.proxy.login
let password = ConfigurationData.proxy.password
let sessionConfiguration = URLSessionConfiguration.default
let userPasswordString = "\(login):\(password)"
let userPasswordData = userPasswordString.data(using: String.Encoding.utf8)
let base64EncodedCredential = userPasswordData!.base64EncodedString(options: Data.Base64EncodingOptions(rawValue: 0))
let authString = "Basic \(base64EncodedCredential)"
sessionConfiguration.httpAdditionalHeaders = ["Authorization" : authString]
sessionConfiguration.connectionProxyDictionary = [
"HTTPEnable": true,
"HTTPPort": ConfigurationData.proxy.port,
"HTTPProxy": ConfigurationData.proxy.host,
"HTTPSEnable": true,
"HTTPSPort": ConfigurationData.proxy.port,
"HTTPSProxy": ConfigurationData.proxy.host
]
return sessionConfiguration
}
public func getPage(_ url: URL, completion: @escaping (String?, RequestError?) -> Void) {
let session = URLSession(configuration: getProxySessionConfigration())
let task = session.dataTask(with: url) { (data, response, error) in
guard let httpResponse = response as? HTTPURLResponse,
(200...299).contains(httpResponse.statusCode) else {
if let error = error {
completion(nil, .requestFailed(error))
} else {
completion(nil, .unknown(response))
}
return
}
if let data = data {
print(httpResponse)
if let urlContent = NSString(data: data, encoding: String.Encoding.utf8.self.rawValue) {
completion(urlContent as String, nil)
} else {
completion(nil, .dataDecodeFailed(data))
}
} else {
completion(nil, .noData)
}
}
task.resume()
}
let requestAvito = AvitoProjectPlaygroud_Sources.RequestAvito()
let url = URL(string: "https://www.avito.ru/krasnodar/vakansii/voditel_v_yandeks_taksi_zarabotok_ot_1388074044")!
requestAvito.getPage(url) { (htmlString, error) in
if let error = error {
switch error {
case .noData: print("ERROR: no data")
case .unknown(let response):
print("ERROR: unknown error")
if let response = response { print(response) }
case .urlFailed: print("ERROR: url generating failed")
case .requestFailed(let returnedError): print("ERROR: \(returnedError)")
case .dataDecodeFailed(let data):
print("ERROR: data decoding failed")
print(data!)
}
return
}
if let htmlString = htmlString {
// print(htmlString)
print(String(htmlEncodedString: htmlString))
} else {
print("NO DATA")
}
}
对于您的问题,首先(在做其他事情之前,请确保您的代理处理HTTPS代理),如果否,则不管您输入的代码如何 要处理HTTPS代理,有两个键可以使用,似乎您正在使用它。我可以看到的一件事是,您使用true作为布尔值,等等 根据我的经验,我总是使用数值或字符串 确保数据以字符串/Int(true->1)等形式传递,这可能会有所帮助 有时,它会对那些将“真”转换为1的假设产生一些问题 下面是我如何使用它的示例:
let request = URLRequest(url: URL(string: url)!)
let config = URLSessionConfiguration.default
config.requestCachePolicy = URLRequest.CachePolicy.reloadIgnoringLocalCacheData
config.connectionProxyDictionary = [AnyHashable: Any]()
config.connectionProxyDictionary?[kCFNetworkProxiesHTTPEnable as String] = 1
config.connectionProxyDictionary?[kCFNetworkProxiesHTTPProxy as String] = "xxx.yyy.zzz.bbb"
config.connectionProxyDictionary?[kCFNetworkProxiesHTTPPort as String] = 8888
config.connectionProxyDictionary?[kCFStreamPropertyHTTPSProxyHost as String] = "xxx.yyy.zzz.bbb"
config.connectionProxyDictionary?[kCFStreamPropertyHTTPSProxyPort as String] = 8888
简言之:
- 首先验证您的代理(确保已处理https代理)
- 然后按上述方式传递数据
希望它能解决您的问题。谢谢您的回答。我检查了你的代码,得到了同样的问题-error((一个也检查了代理(使用命令行))并且它可以同时工作两种类型-HTTPS和HTTPS