2014-09-10 86 views
0

我使用Retrofit作为我的网络库。一切都运转平稳。 我刚刚有一个新的要求,服务器发送给我一个响应在JSON,如果失败。 我想抓取整个响应,现在RetrofitError失败回调,不会给我的服务器回应任何RetrofitError属性。在改造中处理错误响应android

任何形式的帮助,将不胜感激。谢谢。

+0

难道你没有得到RetrofitError中的响应吗? – Blackbelt 2014-09-10 15:53:36

+0

@blackbelt我这样做,但它的解析 例如,如果响应是“项目未找到” 它会给我“未找到”我想从http – ShahrozKhan91 2014-09-10 15:56:35

+0

的原始响应你试图摆脱响应?从你的服务器重新加载一些json的东西? – nPn 2014-09-10 16:21:20

回答

1

我想你想得到的是从失败期间从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); 

    } 
} 
+0

非常感谢,非常详细的答案,这就是我想要的。 – ShahrozKhan91 2014-09-10 17:56:30