2015-11-18 21 views
61

का उपयोग कर प्रतिक्रिया स्थिति कोड प्राप्त करें मैं रेट्रोफिट 2.0 में अपग्रेड करने और अपने एंड्रॉइड प्रोजेक्ट में आरएक्सजेवा जोड़ने की कोशिश कर रहा हूं। मैं एक एपीआई कॉल कर रहा हूं और सर्वर से त्रुटि प्रतिक्रिया के मामले में त्रुटि कोड पुनर्प्राप्त करना चाहता हूं।रेट्रोफिट 2.0 और आरएक्सजेवा

Observable<MyResponseObject> apiCall(@Body body); 

और RxJava कॉल में:

myRetrofitObject.apiCall(body).subscribe(new Subscriber<MyResponseObject>() { 
     @Override 
     public void onCompleted() { 

     } 

     @Override 
     public void onError(Throwable e) { 

     } 

     @Override 
     public void onNext(MyResponseObject myResponseObject) { 
      //On response from server 
     } 
    }); 

रेट्रोफिट 1.9 में, RetrofitError अभी भी अस्तित्व में है और हम ऐसा करके दर्जा मिल सकता है:

error.getResponse().getStatus() 

आप के साथ ऐसा कैसे करते हैं RxJava का उपयोग कर Retrofit 2.0? API कॉल की घोषणा की

उत्तर

122

इसके बजाय जैसे तुमने किया था:

Observable<MyResponseObject> apiCall(@Body body); 

तुम भी इसे इस तरह की घोषणा कर सकते हैं:

new Subscriber<Response<StartupResponse>>() { 
    @Override 
    public void onCompleted() {} 

    @Override 
    public void onError(Throwable e) { 
     Timber.e(e, "onError: %", e.toString()); 

     // network errors, e. g. UnknownHostException, will end up here 
    } 

    @Override 
    public void onNext(Response<StartupResponse> startupResponseResponse) { 
     Timber.d("onNext: %s", startupResponseResponse.code()); 

     // HTTP errors, e. g. 404, will end up here! 
    } 
} 
:

Observable<Response<MyResponseObject>> apiCall(@Body body); 

फिर आप निम्नलिखित की तरह एक सब्सक्राइबर होगा

तो, एक त्रुटि कोड के साथ सर्वर प्रतिक्रिया onNext पर भी वितरित की जाएगी और आप प्राप्त कर सकते हैं reponse.code() पर कॉल करके कोड।

http://square.github.io/retrofit/2.x/retrofit/retrofit/Response.html

संपादित करें: ठीक है, मैं अंत में चारों ओर में क्या ई-नूरी उनकी टिप्पणी, अर्थात् है कि केवल 2xx कोड onNext करने के लिए होगा में कहा की तलाश करने के लिए मिला है। पता चला है कि हम दोनों सही हैं:

कॉल इस तरह की घोषणा की है, तो:

Observable<Response<MyResponseObject>> apiCall(@Body body); 

या यहाँ तक कि इस

Observable<Response<ResponseBody>> apiCall(@Body body); 

सभी प्रतिक्रियाओं onNext में खत्म हो जाएगा उनके त्रुटि की परवाह किए बिना, कोड। यह संभव है क्योंकि सब कुछ रेट्रोफिट द्वारा Response ऑब्जेक्ट में लपेटा गया है।

दूसरे हाथ पर, कॉल इस तरह घोषित किया जाता है, तो:

Observable<MyResponseObject> apiCall(@Body body); 

या इस

Observable<ResponseBody> apiCall(@Body body); 

वास्तव में केवल 2xx प्रतिक्रियाओं onNext के लिए जाना जाएगा। बाकी सब कुछ HttpException में लपेटा जाएगा और onError पर भेजा जाएगा। जो भी समझ में आता है, क्योंकि Response रैपर के बिना, onNext पर उत्सर्जित होना चाहिए? यह देखते हुए कि अनुरोध सफल नहीं हुआ था उत्सर्जित करने के लिए एकमात्र समझदार चीज़ null होगी ...

+9

HTTP कोड 4xx की तलाश करने वाले लोगों के लिए वे ऑनर में एचटीपीएक्सप्शन के रूप में समाप्त हो जाएंगे। onNext में केवल 2xx होगा। –

+2

यह दिलचस्प है ... मैंने अभी फिर से जांच की है (https://gist.github.com/DavidMihola/17a6ea373b9312fb723b) और मैंने जिन सभी कोडों को 'ऑननेक्स्ट' में 404 इत्यादि सहित समाप्त करने की कोशिश की, मैंने रेट्रोफिट v2.0.0-beta3 का उपयोग किया । –

+0

@ ई-नौरी: मैंने अभी अपने उत्तर में एक पैराग्राफ जोड़ा है जो आपकी टिप्पणी को ध्यान में रखता है! –

54

अंदर onError विधि इस के लिए रखा कोड

((HttpException) e).code() 
+4

यह एसओ में कभी देखा गया सबसे निचला उत्तर में से एक हो सकता है। यह प्रतिभा है। आप 'HttpException' के साथ प्रतिक्रिया के साथ जो कुछ भी करने की आवश्यकता हो सकती है वह कर सकते हैं। मैं आरएक्सजेवा का उपयोग कर रहा हूं और मुझे 'HTTP 400 बाड अनुरोध' प्राप्त करने के बाद प्रतिक्रिया को पार करने की आवश्यकता है। आपका बहुत बहुत धन्यवाद! – GabrielOshiro

+13

बस यह सुनिश्चित करना सुनिश्चित करें कि यह पहले HttpException का उदाहरण है क्योंकि NetworkErrors IOExceptions होगा और स्थिति कोड नहीं है। –

+0

@ बेंजामिन मेसिंग से पालन करने के लिए नेटवर्क एरर के बारे में कहा गया है, यदि आप सदस्यता लेने से पहले अपने आरएक्स में अधिक डाउनस्ट्रीम ऑपरेटरों (मानचित्र/फ्लैटमैप/के लिए आदि) कर रहे हैं तो वहां संभावित अपवाद प्रकारों का एक मेजबान हो सकता है, और जरूरी नहीं कि एक त्रुटि नेटवर्क अनुरोध पर। –

1

आप को ध्यान देना चाहिए पाने कि के रूप में Retrofit2 कोड के साथ सभी प्रतिक्रियाओं 2xx onNext() कॉलबैक और के बाकी HTTP से बुलाया जाएगा कोड 4xx की तरह, 5xx onError() कॉलबैक पर बुलाया जाएगा, Kotlin का उपयोग कर रहा onError में कुछ इस तरह() के साथ आया है:

mViewReference?.get()?.onMediaFetchFinished(downloadArg) 
    if (it is HttpException) { 
    val errorCode = it.code() 
    mViewReference?.get()?.onMediaFetchFailed(downloadArg,when(errorCode){ 
     HttpURLConnection.HTTP_NOT_FOUND -> R.string.check_is_private 
     else -> ErrorHandler.parseError(it) 
    }) 
    } else { 
    mViewReference?.get()?.onMediaFetchFailed(downloadArg, ErrorHandler.parseError(it)) 
    } 
संबंधित मुद्दे