मेरी रेट्रोफिट एपीआई विधि वर्तमान में एक पेलोड संरचना को स्वीकार कर रही है। हालांकि, अनुरोध में कोई त्रुटि होने पर बैकएंड एक अलग पेलोड संरचना लौटा सकता है।

उदाहरण के लिए:

public void search(String term, final CallBack <ArrayList<String>> callBack) {
    RetroGenerator.createService(APIServices.class).search(term).enqueue(new Callback<ArrayList<String>> () {
            @Override
            public void onResponse(Call<ArrayList<String>> call, Response<ArrayList<String>> response) {
                if (response.isSuccessful()) {
                    callBack.onSuccess(response.body());
                }

                return;
            }
            callBack.onError();
        }

        @Override public void onFailure(Call<ArrayList<String>> call, Throwable t) {
            callBack.onError();
        }
    });
}

बैकएंड स्ट्रिंग मानों की एक सरणी लौटा रहा है। हालाँकि, यदि कोई त्रुटि होती है, तो बैकएंड निम्नलिखित पेलोड संरचना लौटा सकता है:

{
   "error": "Term can't be empty",
   "code": 403
}

लेकिन जिस तरह से मेरी एपीआई विधि स्थापित की गई है, वह केवल एक जावा मॉडल को स्वीकार करती है।

एपीआई इंटरफ़ेस:

@FormUrlEncoded
@POST("api/v1/search.json")
Call<ArrayList<String>> search(@Field("term") String term);

वर्तमान में यह केवल एक ArrayList<String> स्वीकार कर रहा है और कस्टम त्रुटि पेलोड मॉडल को स्वीकार नहीं करता है। यह देखते हुए कि मैं Error नामक एक नया मॉडल बनाता हूं:

public class Error {
   public String error;
   public int code;
}

त्रुटि होने पर मैं रेट्रोफिट एपीआई विधि के मॉडल को कैसे बदल सकता हूं?

0
Dinuka Jay 20 नवम्बर 2017, 05:30

1 उत्तर

सबसे बढ़िया उत्तर

आपकी असफल प्रतिक्रियाओं को संभालने के लिए आपके पास ErrorUtils क्लास हो सकती है:

पब्लिक क्लास ErrorUtils {

public static ApiError parseError(Response<?> response) {
    Converter<ResponseBody, ApiError> converter = ServiceGenerator.retrofit().
            responseBodyConverter(ApiError.class, new Annotation[0]);

    ApiError apiError;

    try {
        apiError = converter.convert(response.errorBody());
    } catch (IOException e) {
        apiError = new ApiError();
    }

    return apiError;
}

}

फिर जब आपको असफल प्रतिक्रिया मिलती है, तो ErrorUtils वर्ग के साथ प्रतिक्रिया को पार्स करें:

if (!response.isSuccessful()) {
    // ...
    ApiError apiError = ErrorUtils.parseError(response);
}

एपीइरर क्लास:

public class ApiError {
@SerializedName("error")
private String mErrorDescription;

@SerializedName("code")
private Integer mErrorCode;

public ApiError() {}

public void setErrorCode(Integer code) {
    this.mErrorCode = code;
}

public Integer getErrorCode() {
    return mErrorCode;
}

public String getErrorDescription() {
    return mErrorDescription;
}

public void setErrorDescription(String errorDescription) {
    mErrorDescription = errorDescription;
}

}

1
Oscar Rene 20 नवम्बर 2017, 05:44