2015-12-09 9 views
5

के साथ पुन: प्रमाणीकरण को संभालना मेरे पास एक प्रोजेक्ट है जहां मैं RxSwift एक्सटेंशन के साथ मोया का उपयोग कर रहा हूं। सरल उपयोग के मामले ठीक काम करते हैं, मैं अनुरोध करने में सक्षम हूं और पर्यवेक्षकों के रूप में प्रतिक्रिया प्राप्त करता हूं।RxSwift और Moya

public func test() -> Observable<Response> { 
    return provider 
    .request(.test) 
    .retry(5) 
} 

मैं फिर देखरेख के लिए सदस्यता ले सकता हूं और बिना किसी समस्या के प्रतिक्रिया को मुद्रित कर सकता हूं।

लेकिन अब मुझे प्रमाणीकरण तर्क को संभालने की आवश्यकता है। जिस तरह से यह काम करता है वह यह है कि मैं उपरोक्त अनुरोध को HTTP शीर्षलेख फ़ील्ड के रूप में जोड़े गए टोकन के साथ चलाता हूं। मोया मुझे एंडपॉइंटक्लोजर में एंडपॉइंट ByAddingHTTPHeaderFields का उपयोग कर पारदर्शी रूप से अनुमति देता है। अभी तक कोई समस्या नहीं है।

समस्या

उठता है जब अनुरोध HTTP स्थिति 401, इसका मतलब है कि मैं एक और अंत बिंदु को फोन करके पुन: प्रमाणीकृत करने की जरूरत है

provider.request(.auth(user, pass)).retry(5) 

यह एक और प्रत्यक्ष रिटर्न कि मैं आसानी से JSON करने के लिए नक्शे नया पाने के लिए कर सकते हैं के साथ विफल टोकन।

मुझे बस परीक्षण() पर कॉल करना होगा!

तो मेरे सवाल का मैं इस प्रमाणीकरण तर्क परीक्षण के अंदर() समारोह ऊपर जोड़ सकते हैं, जिससे कि प्रत्यक्ष) परीक्षण (द्वारा दिया पहले से ही गारंटी है फिर से चलाने के लिए है ... विफलता के मामले में प्रमाणीकरण तर्क और दूसरे पुन: प्रमाणीकृत अनुरोध का परिणाम बनें।

मैं आम तौर पर आरएक्सस्विफ्ट और आरएक्स के लिए बहुत नया हूं, इसलिए मैं ऑपरेटरों के बारे में थोड़ा सा अनजान हूं जो मैं ऐसा करने के लिए उपयोग करता हूं।

धन्यवाद!

+0

क्या आपने कभी इसे हल किया है? – tskulbru

+0

क्या 401 एक त्रुटि के रूप में आता है, या यह एक वैध प्रतिक्रिया वस्तु है? –

+0

यदि पूर्व, यह उत्तर आपकी मदद कर सकता है: http://stackoverflow.com/questions/35841054/rxswift-user-input-on-error-and-continuation/38341690#38341690 –

उत्तर

0
public func test(with authToken: String) -> Observable<Response> { 
    return provider 
     .request(.test) 
     .endpointByAddingHTTPHeaderFields(["Authorization": authToken]) 
     .catchError { error in 
     if needsReauth(error) { 
      return provider.request(.auth(user, pass)).map { parseToken($0) } 
      .flatMap { token in 
       return test(with: token) 
      } 
     } else { 
      return .error(error) 
     } 
     } 
} 

catchError एक और नमूदार का उपयोग कर के नमूदार निष्पादन जारी रखने के लिए सक्षम बनाता है। देखे जाने योग्य हम निम्नलिखित को निम्नलिखित करते हैं:

  1. सबसे पहले, यह .auth एंडपॉइंट का अनुरोध करेगा।
  2. यह फिर नया ऑथ टोकन
  3. प्राप्त करने के लिए प्रतिक्रिया से पढ़ता है, अंत में, हम परीक्षण बिंदु को पूछताछ करने के लिए पुनः प्रयास करने के लिए test(with authToken: String) पर कॉल करते हैं।
संबंधित मुद्दे