2016-12-03 15 views
7

का उपयोग Alamofire 4/स्विफ्ट 3 कैसे आप एक अनुरोध के बीच अंतर कर सकते हैं कि के कारण विफल रहता है:अलामोफ़ीयर: नेटवर्क त्रुटि बनाम अमान्य स्थिति कोड?

  1. नेटवर्क कनेक्टिविटी (नीचे की मेजबानी, मेजबान नहीं पहुँच सकते हैं) बनाम
  2. अमान्य सर्वर HTTP प्रतिक्रिया कोड (यानी: 49 9) जो validate() पर कॉल करने के कारण अलामोफ़ीयर अनुरोध विफल होने का कारण बनता है?

कोड:

sessionManager.request(url, method: .post, parameters:dict, encoding: JSONEncoding.default) 
     .validate() //Validate status code 
     .responseData { response in 

     if response.result.isFailure { 
       //??NETWORK ERROR OR INVALID SERVER RESPONSE?? 
     } 
    } 

हम अलग ढंग से प्रत्येक मामले को संभालने के लिए चाहते हैं। बाद के मामले में हम प्रतिक्रिया पूछताछ करना चाहते हैं। (पूर्व में हम नहीं करते हैं क्योंकि कोई प्रतिक्रिया नहीं है)। जब आप गलत सर्वर HTTP प्रतिक्रिया कोड 5xx (499 का मतलब है Client Closed Request) आप यकीन है कि यह मान्यता से निर्भर नहीं है कर रहे हैं पाने के

+0

अरे मार्कस, इस के लिए अपने अंतिम समाधान क्या था? –

उत्तर

3

यहां हमारा वर्तमान कार्य समाधान है:

sessionManager.request(url, method: .post, parameters:dict, encoding: JSONEncoding.default) 
    .validate() //Validate status code 
    .responseData { response in 

    if response.result.isFailure { 
     if let error = response.result.error as? AFError, error.responseCode == 499 { 
      //INVALID SESSION RESPONSE 
     } else { 
      //NETWORK FAILURE 
     } 
    } 
} 

यदि result.error यह AFError प्रकार है तो आप responseCode का उपयोग कर सकते हैं।(?): AFError स्रोत टिप्पणियों से

/// Returns whether the `AFError` is a response validation error. When `true`, the `acceptableContentTypes`, 
/// `responseContentType`, and `responseCode` properties will contain the associated values. 
public var isResponseValidationError: Bool { 
    if case .responseValidationFailed = self { return true } 
    return false 
} 

हो सकता है कि वहाँ एक बेहतर तरीका है, लेकिन यह काम करने के लिए लगता है ...

1

स्वत: सत्यापन200 के भीतर स्थिति कोड ... 299 (सफलता कोड) तो सीमा पर विचार करना चाहिए।

statusCode के बारे में, मेरी सलाह है कि इसे प्राप्त करने के लिए सही नए नियमों का पालन करना है। अगर आपको इसे पुनर्प्राप्त करने में कुछ समस्या है तो इसे SO answer देखें।

नेटवर्क गम्यता बारे में बोलते हुए आप लिख सकते हैं:

let manager = NetworkReachabilityManager(host: "www.apple.com") 
manager?.listener = { status in 
    print("Network Status Changed: \(status)") 
} 
manager?.startListening() 

कुछ महत्वपूर्ण चीजों जब नेटवर्क गम्यता का उपयोग कर आगे क्या करना है यह निर्धारित करने के याद करने के लिए कर रहे हैं।

  • यह निर्धारित करने के लिए पहुंचने का उपयोग न करें कि नेटवर्क अनुरोध भेजा जाना चाहिए या नहीं। आपको हमेशा इसे भेजना चाहिए।
  • जब पहुंच योग्यता बहाल की जाती है, विफल नेटवर्क अनुरोधों को पुनः प्रयास करने के लिए ईवेंट का उपयोग करें। भले ही नेटवर्क अनुरोध अभी भी असफल हो सकते हैं, फिर भी यह उन्हें पुनः प्रयास करने के लिए अच्छा पल है।
  • नेटवर्क पहुंच क्षमता स्थिति यह निर्धारित करने के लिए उपयोगी हो सकती है कि नेटवर्क अनुरोध विफल क्यों हो सकता है। यदि कोई नेटवर्क अनुरोध विफल रहता है, तो यह उपयोगकर्ता को यह बताने के लिए और अधिक उपयोगी है कि अधिक तकनीकी त्रुटि के बजाय ऑफ़लाइन होने के कारण नेटवर्क अनुरोध विफल हुआ, जैसे "अनुरोध समय समाप्त हो गया।"

आप आधिकारिक Alamofire 4 GitHub में यह विवरण प्राप्त कर सकते हैं page

1

Alamofire अनुरोध के बारे में आपको बता सकता है, इस कोड को ठीक मेरे लिए काम करता है:

if let error = response.result.error as? NSError { 
    print(error)//print the error description 
    if (error.code == -1009){ 
        print(error.code) // this will print -1009,somehow it means , there is no internet connection 
        self.errorCode = error.code 

    } 
     //check for other error.code  

}else{ 
    //there is no problem 
} 

error.code आपको बताएगा कि समस्या क्या है

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