2017-03-06 3 views
13

एक एपीआई अनुरोध के लिए मैं प्रॉक्सी का उपयोग कर एक URL सत्र स्थापित करने की कोशिश कर रहा हूं। परीक्षण उद्देश्यों के लिए मैं एक सार्वजनिक प्रॉक्सी और आईपी का जवाब देने वाले एपीआई का उपयोग कर रहा हूं।स्विफ्ट में प्रॉक्सी के साथ URLSession का उपयोग कैसे करें 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() 
} 

द्वारा कहा जाता है:

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

यह config की तरह लगता है पूरी तरह से नजरअंदाज कर दिया है क्योंकि भले साथ प्रॉक्सी आईपी बना, उसका जवाब दिया आईपी हमेशा वास्तविक उपकरणों आईपी

किसी भी मदद अत्यधिक है की सराहना की।

संपादित करें: उपयोगकर्ता हैसन 83 द्वारा सुझाए गए अनुसार, "HTTPS कुंजी" लेना एक विकल्प नहीं है।

enter image description here enter image description here

+0

हैलो, 142.54.173.19 इस आईपी जो आईपी पते, रूटर या अन्य है दे सकता है। ? –

उत्तर

7

मैं काम कर लगता है (चाहिए बहिष्कृत किया जाना चाहिए) कुंजी हैं:

kCFStreamPropertyHTTPSProxyHost 
kCFStreamPropertyHTTPSProxyPort 

क्या आप इस कोड को आजमा सकते हैं?

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() 
} 

यह भी सुनिश्चित करें आपके प्रॉक्सी सर्वर https अनुरोधों को हैंडल करने के लिए कॉन्फ़िगर है कि सुनिश्चित करें।

ध्यान दें: यह उन कुंजियों लेकिन चाबी के लिए deprecated चेतावनी अभी भी काम कर रहे हैं (https://forums.developer.apple.com/thread/19356#131446 देखें)

+0

काम करने लगता है। कल और परीक्षण होंगे, लेकिन ऐसा लगता है। –

+0

जहां तक ​​मेरा वर्तमान शोध चलता है, आपकी कॉन्फ़िगरेशन को यहां भी काम करना चाहिए, इसलिए कृपया कोशिश करने के लिए स्वतंत्र महसूस करें और मान्य होने पर, यहां जवाब दें: http://stackoverflow.com/questions/42616908/how-to-use- ए-प्रॉक्सी-सर्वर-साथ-अलामोफायर -4-और-स्विफ्ट -3 –

+0

हाँ वही कॉन्फ़िगरेशन को अलामोफ़ीयर सत्र प्रबंधक के साथ काम करना चाहिए क्योंकि वे URLSessionConfiguration.default का भी उपयोग कर रहे हैं। सर उठाने के लिए धन्यवाद। मैं वहां जवाब पोस्ट करूंगा। – manishg

1

मैं अगर है कि मेकअप भावना यकीन नहीं है।

  1. HTTP
  2. HTTPS

प्रॉक्सी कुंजी:: लेकिन, क्या यहां चाबियों का दो defferent सेट है

// http proxy keys 
kCFNetworkProxiesHTTPEnable 
kCFNetworkProxiesHTTPProxy 
kCFNetworkProxiesHTTPPort 

// https proxy keys 
kCFNetworkProxiesHTTPSEnable 
kCFNetworkProxiesHTTPSProxy 
kCFNetworkProxiesHTTPSPort 
+0

मैंने आपके द्वारा सुझाए गए https मानों की प्रतिलिपि बनाई/चिपका दी है, लेकिन सभी के लिए मुझे "xy अनुपलब्ध है"। प्लस, HTTP "एस" एक ऑटोफिल –

+0

में उपलब्ध नहीं है अतिरिक्त स्क्रीन देखें –

संबंधित मुद्दे