2017-03-06 29 views
13

Đối với yêu cầu API Tôi đang cố gắng thiết lập URLSession bằng Proxy. Đối với mục đích thử nghiệm, tôi đang sử dụng Proxy công khai và API đáp ứng IP.Cách sử dụng URLSession với Proxy trong Swift 3

func makeRequestViaUrlSessionProxy(_ url: String, completion: @escaping (_ result: String?) ->()) { 

    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] = "142.54.173.19" 
    config.connectionProxyDictionary?[kCFNetworkProxiesHTTPPort as String] = 8888 

    let session = URLSession.init(configuration: config, delegate: nil, delegateQueue: OperationQueue.current) 

    let task = session.dataTask(with: request) { 
     (data: Data?, response: URLResponse?, error: Error?) in 
     if error != nil { 
      NSLog("Client-side error in request to \(url): \(error)") 
      completion(nil) 
      return 
     } 

     if data == nil { 
      NSLog("Data from request to \(url) is nil") 
      completion(nil) 
      return 
     } 

     let httpResponse = response as? HTTPURLResponse 
     if httpResponse?.statusCode != 200 { 
      NSLog("Server-side error in request to \(url): \(httpResponse)") 
      completion(nil) 
      return 
     } 

     let encodingName = response?.textEncodingName != nil ? response?.textEncodingName : "utf-8" 
     let encoding = CFStringConvertEncodingToNSStringEncoding(CFStringConvertIANACharSetNameToEncoding(encodingName as CFString!)) 
     let stringData = String(data: data!, encoding: String.Encoding(rawValue: UInt(encoding))) 
     session.invalidateAndCancel() 
     completion(stringData) 
    } 
    task.resume() 
} 

gọi theo:

override func viewDidLoad() { 
    super.viewDidLoad() 
    makeRequestViaUrlSessionProxy("https://api.ipify.org?format=json") { string in 
     print(string) 
    } 
} 

Nó có vẻ như các config là hoàn toàn bỏ qua bởi vì ngay cả với tạo Proxy IP, IP trả lời luôn luôn là các thiết bị thực tế IP

Bất kỳ sự giúp đỡ rất đánh giá cao.

Chỉnh sửa: theo đề xuất của Người dùng hasan83, việc "khóa HTTPS" có vẻ không phải là một tùy chọn.

enter image description here enter image description here

+0

hello, 142.54.173.19 ip này là có địa chỉ IP, router hoặc khác. ? –

Trả lời

7

Tôi nghĩ rằng làm việc (giả không được dùng nữa) là:

kCFStreamPropertyHTTPSProxyHost 
kCFStreamPropertyHTTPSProxyPort 

Bạn có thể thử mã này không?

func makeRequestViaUrlSessionProxy(_ url: String, completion: @escaping (_ result: String?) ->()) { 

    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] = "142.54.173.19" 
    config.connectionProxyDictionary?[kCFNetworkProxiesHTTPPort as String] = 8888 
    config.connectionProxyDictionary?[kCFStreamPropertyHTTPSProxyHost as String] = "142.54.173.19" 
    config.connectionProxyDictionary?[kCFStreamPropertyHTTPSProxyPort as String] = 8888 

    let session = URLSession.init(configuration: config, delegate: nil, delegateQueue: OperationQueue.current) 

    let task = session.dataTask(with: request) { 
     (data: Data?, response: URLResponse?, error: Error?) in 
     if error != nil { 
      NSLog("Client-side error in request to \(url): \(error)") 
      completion(nil) 
      return 
     } 

     if data == nil { 
      NSLog("Data from request to \(url) is nil") 
      completion(nil) 
      return 
     } 

     let httpResponse = response as? HTTPURLResponse 
     if httpResponse?.statusCode != 200 { 
      NSLog("Server-side error in request to \(url): \(httpResponse)") 
      completion(nil) 
      return 
     } 

     let encodingName = response?.textEncodingName != nil ? response?.textEncodingName : "utf-8" 
     let encoding = CFStringConvertEncodingToNSStringEncoding(CFStringConvertIANACharSetNameToEncoding(encodingName as CFString!)) 
     let stringData = String(data: data!, encoding: String.Encoding(rawValue: UInt(encoding))) 
     session.invalidateAndCancel() 
     completion(stringData) 
    } 
    task.resume() 
} 

Cũng vui lòng đảm bảo máy chủ proxy của bạn được định cấu hình để xử lý yêu cầu https.

Lưu ý: Nó có thể cung cấp cho deprecated cảnh báo đối với những phím nhưng các phím vẫn đang làm việc (xem https://forums.developer.apple.com/thread/19356#131446)

+0

dường như hoạt động. sẽ có nhiều thử nghiệm hơn vào ngày mai, nhưng điều này có vẻ như vậy. –

+0

theo như nghiên cứu hiện tại của tôi, cấu hình của bạn cũng hoạt động ở đây, vì vậy, vui lòng thử và nếu hợp lệ, hãy trả lời tại đây: http://stackoverflow.com/questions/42616908/how-to-use- a-proxy-server-with-alamofire-4-and-swift-3 –

+0

Vâng cùng một cấu hình sẽ hoạt động với trình quản lý phiên alamofire vì chúng cũng đang sử dụng URLSessionConfiguration.default. Cảm ơn cho những người đứng đầu lên. Tôi sẽ đăng câu trả lời ở đó. – manishg

1

Tôi không chắc chắn nếu điều đó có ý nghĩa. Nhưng, có hai defferent bộ chìa khóa ở đây:

  1. HTTP
  2. HTTPS

Proxy Keys:

// http proxy keys 
kCFNetworkProxiesHTTPEnable 
kCFNetworkProxiesHTTPProxy 
kCFNetworkProxiesHTTPPort 

// https proxy keys 
kCFNetworkProxiesHTTPSEnable 
kCFNetworkProxiesHTTPSProxy 
kCFNetworkProxiesHTTPSPort 
+0

Tôi đã sao chép/dán các giá trị https mà bạn đề xuất, nhưng đối với tất cả những gì tôi nhận được "xy không khả dụng". Ngoài ra, HTTP "S" không có sẵn trong tự động –

+0

xem màn hình bổ sung –

Các vấn đề liên quan