Android成功的JSON响应但是response.isSuccess()不是真的

时间:2016-02-22 02:13:59

标签: android json gson instagram

我终于从Instagram的API获得了访问令牌的响应。

final Call<TokenResponse> accessToken =  ServiceManager.createTokenService().getAccessToken(request);
accessToken.enqueue(new Callback<TokenResponse>() {
    @Override
    public void onResponse(Call<TokenResponse> call, Response<TokenResponse> response) {
        mtext.setText("hello");
      }

    @Override
    public void onFailure(Call<TokenResponse> call, Throwable t) {
        mtext.setText("failure");
    }
});

然而,当我检查response.isSuccess()是否失败?我不明白这一点。

另外,我正在使用Retrofit 2,如果它自动映射数据,我已经导入了Gson吗?

1 个答案:

答案 0 :(得分:5)

在改造2中,onFailure仅在HTTP请求期间发生网络或意外异常时调用。

response.isSuccess()当http状态为2xx或3xx时,它将返回true,否则,它将返回false。

因此,当isSuccess为true时,您可以使用正确的数据模型来映射json。您可以定义一个常见的错误模型,以便在isSuccess为false时映射json。

[编辑]在我的项目中添加一些我使用retrofit2的代码片段,希望这对你有帮助。

@Override public void onResponse(Response<T> response, Retrofit retrofit) {
  onNetworkRequestFinished();
  if (response.isSuccess()) {
    onSuccess(response.body());
  } else {
    onFailed(response, retrofit);
  }
 }


@Override public void onSuccess(SignupResponse signupResponse) {
  ((JFragmentActivity) context).dialogHelper.dismissProgressDialog();
  sharedPreferenceHelper.saveLoginName(context, userName); 
  doAfterSignin(context, signupResponse);
}


public void onFailed(Response response, Retrofit retrofit) {
  Converter<ResponseBody, JErrorReponse> errorConverter =
    retrofit.responseConverter(JErrorReponse.class, new Annotation[0]);

    try {
      JErrorReponse error = errorConverter.convert(response.errorBody());
      if (error != null) {
        JToast.toastLong(error.msg);
      }
    } catch (Exception e) {
      e.printStackTrace();
    }
  }

JErrorResponse.java

public class JErrorReponse implements Serializable {
  public int status;
  public String msg;
  public Object err;
}

SignupResponse.java

public class SignupResponse extends BaseResponse {

  public UserLoginData data;
}

UserLoginData.java

public class UserLoginData implements Serializable {
  @SerializedName("u_id") public int uId;

  @SerializedName("username") public String userName;

  public String icon;
}