所以我在登录时没有问题就从Json收到一个令牌,并收到哈希
但是当来自服务器的响应是一个错误时,我无法得到Json消息({message:“错误:错误的电子邮件}”因为在onError中我们只得到一个Throwable作为参数,而不是像on on那样的模型类
如何从服务器上获取json消息onError ??
final Observable<TokenResponse> observable = Service.login(userCredentials);
observable.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<TokenResponse>() {
String error="";
@Override
public void onCompleted() {
mLoginView.whenLoginSucess();
}
@Override
public void onError(Throwable e) {
if (e instanceof HttpException) {
HttpException exception = (HttpException) e;
Response response = exception.response();
Converter<ResponseBody, ErrorFromServer> converter = new GsonConverterFactory()
.responseBodyConverter(ErrorFromServer.class, Annotation[0]);
ErrorFromServer error = converter.convert(response.errorBody());
}
mLoginView.errorText(error);
e.printStackTrace();
}
@Override
public void onNext(TokenResponse tokenResponse) {
SharedPreferences.Editor editor = sharedP.edit();
editor.putString("hash", tokenResponse.getToken());
editor.commit();
//getString return key value "hash" if there is no value, returns null
hash = sharedP.getString("hash",null);
}
});
TokenResponse代码
public class TokenResponse {
@SerializedName("hash")
@Expose
private String token;
@SerializedName("message")
@Expose
private String message;
public String getMessage() {return message;}
public String getToken() {
return token;
}
}
答案 0 :(得分:10)
我找到了一个解决方案,我有一个创建Retrofit的应用程序类,然后我创建了一个ResponseBody并使用responseBodyConverter转换(,)
@Override
public void onError(Throwable e) {
if (e instanceof HttpException) {
ResponseBody body = ((HttpException) e).response().errorBody();
Converter<ResponseBody, Error> errorConverter =
application.getRetrofit().responseBodyConverter(Error.class, new Annotation[0]);
// Convert the error body into our Error type.
try {
Error error = errorConverter.convert(body);
Log.i("","ERROR: " + error.message);
mLoginView.errorText(error.message);
} catch (IOException e1) {
e1.printStackTrace();
}
}
static class Error{
String message;
}
收到的JSon是{&#34;错误&#34;:4041,&#34;消息&#34;:&#34;未找到电子邮件&#34;}为什么类错误,我刚刚创建了一个变量消息,因为我只想要向用户显示消息
答案 1 :(得分:2)
您正在混合逻辑错误(由于某种原因登录失败)和应用程序错误。如果您的服务器在登录失败的情况下使用HTTP 200和有效的json发送响应,则您的应用程序根本不会调用onError。
所以基本上你需要检查服务器的(成功)响应,并根据提供的json决定登录是否成功。
应该调用onError,例如,如果服务器无法访问或无法提供有效的响应。
编辑:
我不知道你的TokenResponse
包含什么,但基本上登录的响应应该是相同的,无论它是否成功。然后,您只需检查TokenResponse以查明结果是否包含错误。
答案 2 :(得分:0)
override fun onError(e: Throwable?) {
if (e is HttpException) {
Log.i("", "Status code: " + e.code())
Log.i("", "Response: " + e.response()?.errorBody()?.string())
}
}
它对我有用!