我使用Retrofit作爲我的網絡庫。一切都運轉平穩。 我剛剛有一個新的要求,服務器發送給我一個響應在JSON,如果失敗。 我想抓取整個響應,現在RetrofitError失敗回調,不會給我的服務器迴應任何RetrofitError屬性。在改造中處理錯誤響應android
任何形式的幫助,將不勝感激。謝謝。
我使用Retrofit作爲我的網絡庫。一切都運轉平穩。 我剛剛有一個新的要求,服務器發送給我一個響應在JSON,如果失敗。 我想抓取整個響應,現在RetrofitError失敗回調,不會給我的服務器迴應任何RetrofitError屬性。在改造中處理錯誤響應android
任何形式的幫助,將不勝感激。謝謝。
我想你想得到的是從失敗期間從API返回的json響應的字段。我認爲失敗的過程與成功的過程非常相似。首先,你的響應對象需要有一個字段映射到json錯誤字段,或者你想從響應中提取的任何字段(成功或失敗)。在成功案例中,您直接獲取轉換後的響應,但在發生故障時,您需要在返回的RetofitError對象上調用getResponse()以獲取轉換後的響應,然後提取返回的數據。
這裏是一個例子。
我有一個rails後端,在成功時用令牌響應,如果不成功則返回錯誤列表。如果有幫助的話,這裏是rails控制器方法,但是底線是如果創建失敗,我想檢查一下json條目錯誤。
def create
@user = User.new(user_params)
if @user.save
sign_in_api(@user)
render json: { token: @issued_remember_token }, status: 201
else
render json: { errors: @user.errors.full_messages } , status: 406
end
end
這是我改造通話
@POST(API_URL + "/signup")
void signup(@Body UserRequestParams requestParams,
Callback<SignupResponse> tokenParms);
,這裏是我的SignupResponse對象
public class SignupResponse extends BaseResponse {
private String token;
public String getToken() {
return token;
}
}
public class BaseResponse {
private List<String> errors = new ArrayList<String>();
private Boolean mSuccessful = false;
public Response getRawResponse() {
return rawResponse;
}
public void setRawResponse(Response rawResponse) {
this.rawResponse = rawResponse;
}
private Response rawResponse;
public BaseResponse() {
super();
}
public List<String> getErrors() {
return errors;
}
public void setSuccessful(Boolean successful) {
mSuccessful = successful;
}
public Boolean isSuccessful() {
return mSuccessful;
}
}
結果是改造中的錯誤時填充作爲回調過程的一部分,同好像它是成功的。現在我可以檢查響應是否成功,並在響應對象上調用適當的方法。如果成功則錯誤將爲空,但如果不成功則爲有效。
爲了完整起見,這裏是我的例子中涉及的其他兩個方法/類。
@Subscribe
public void onSignup(SignupRequest event) {
System.out.println("inside api repo - making signup request");
mRailsApi.signup(event, new RailsApiCallback<SignupResponse>(mBus, new SignupResponse()));
}
public class RailsApiCallback<T extends BaseResponse> implements Callback<T> {
private Bus mBus;
private T mResponse;
public RailsApiCallback(Bus bus, T response) {
super();
mBus = bus;
mResponse = response;
}
@Override
public void failure(RetrofitError retrofitError) {
System.out.println(retrofitError.toString());
T response = retrofitError != null && retrofitError.getBody() != null ? (T) retrofitError.getBody() : mResponse ;
response.setRawResponse(retrofitError.getResponse());
response.setSuccessful(false);
System.out.println("posting response to bus");
mBus.post(response);
}
@Override
public void success(T convertedResponse, Response rawResponse) {
System.out.println(rawResponse.getBody());
T response = convertedResponse != null ? convertedResponse : mResponse ;
response.setSuccessful(true);
response.setRawResponse(rawResponse);
mBus.post(response);
}
}
非常感謝,非常詳細的答案,這就是我想要的。 – ShahrozKhan91 2014-09-10 17:56:30
難道你沒有得到RetrofitError中的響應嗎? – Blackbelt 2014-09-10 15:53:36
@blackbelt我這樣做,但它的解析 例如,如果響應是「項目未找到」 它會給我「未找到」我想從http – ShahrozKhan91 2014-09-10 15:56:35
的原始響應你試圖擺脫響應?從你的服務器重新加載一些json的東西? – nPn 2014-09-10 16:21:20