Ich habe Probleme: Ich habe einen Login-Prozess erstellt, der eine Antwort zurückgibt. Wenn die Anmeldung wahr ist, gibt es eine Antwort wie diese.fangen Sie die Antwort zurück in MVP mit Repository-Muster
{
"error": false, "message": "Logged In Successfully",
"user": {
"username": "administrator",
"email": "[email protected]",
"first_name": "USER",
"last_name": "ADMIN"
},
"menu": [
{
"name": "MENU A",
"module": "menu_a",
"controller": "",
"parent_module": "",
"status": ""
},
{
"name": "MENU B",
"module": "menu_b",
"controller": " ",
"parent_module": "",
"status": ""
}
],
"privilege": [
{
"module": "menu_a"
},
{
"module": "menu_b"
}
]
}
Dann, wenn es falsch ist, wird Antwort wie folgt zurückgeben.
{ "error": true, "message": "Incorrect Login", "user": {
"username": "none",
"email": "none",
"first_name": "none",
"last_name": "none",
"company": "none",
"phone": "none",
"gender": "none",
"place_of_birth": "none",
"date_of_birth": "none",
"religion": "none",
"photo": "none" }, "menu": "none", "privilege": "none" }
Dies ist mein Code:
public interface AppDataSource {
Single<LoginResponse> attemptLogin(Login login);
Single<LoginResponse> saveUserData(LoginResponse response);
}
public class AppRemoteDataSource implements AppDataSource {
private final Retrofit retrofit;
@Inject
public AppRemoteDataSource(@NonNull Retrofit retrofit) {
this.retrofit = retrofit;
}
@Override
public Single<LoginResponse> attemptLogin(Login login) {
return retrofit.create(OmrService.class).loginUser(login);
}
@Override
public Single<Boolean> checkLogin() {
throw new UnsupportedOperationException();
}
}
public class AppLocalDataSource implements AppDataSource {
@NonNull
private final SharedPreferences sharedPreferences;
@NonNull
private final Realm realm;
@Inject
public AppLocalDataSource(@NonNull SharedPreferences sharedPreferences, @NonNull Realm realm) {
this.sharedPreferences = sharedPreferences;
this.realm = realm;
}
@Override
public Single<Boolean> checkLogin() {
return Single.create(s -> {
Boolean stsLogin = sharedPreferences.getBoolean("IS_USER_LOGIN", >false);
s.onSuccess(stsLogin);
});
}
@Override
public Single<LoginResponse> saveUserData(LoginResponse response) {
return Single.create(e -> {
if(!response.isError()) {
savePreference(response.getUser());
saveMenuPrivilege(response.getMenu(), >response.getPrivilege());
}
e.onSuccess(response);
});
}
}
public class AppRepository implements AppDataSource {
@NonNull
private final AppDataSource localDataSource;
@NonNull
private final AppDataSource remoteDataSource;
@Inject
public AppRepository(@NonNull @Local AppDataSource localDataSource,
@NonNull @Remote AppDataSource remoteDataSource) {
this.localDataSource = localDataSource;
this.remoteDataSource = remoteDataSource;
}
@Override
public Single<LoginResponse> attemptLogin(Login login) {
return remoteDataSource.attemptLogin(login)
.compose(RxUtils.applySingleSchedulers())
.flatMap(localDataSource::saveUserData);
}
@Override
public Single<Boolean> checkLogin() {
return localDataSource.checkLogin();
}
}
public class LoginPresenter implements LoginContract.Presenter {
private LoginContract.View view;
private CompositeDisposable compositeDisposable = new CompositeDisposable();
private AppRepository repository;
@Inject
public LoginPresenter(AppRepository repository, LoginContract.View view) {
this.repository = repository;
this.view = view;
}
private void attemptLogin(Login login) {
view.showProgressIndicator(true);
compositeDisposable.add(repository.attemptLogin(login)
.subscribe(
response -> {
if(response.isError()) {
Log.d("CHECK RESPONSE ", response.getMessage());
view.makeSnack(response.getMessage().toString().replace("<p>","").replace("</p>",""));
} else {
view.showProgressIndicator(false);
view.startMainActivity();
}
} , e -> {
Log.d("CHECK RESPONSE ERROR", e.getMessage());
view.makeSnack(e.getMessage().toString());
view.showProgressIndicator(false);
}
));
}
}
Das Problem ist, wenn ich teste es falsch Benutzername die Antwort, die in Toast zeigt nicht "Falsche Login", statt „com.google. gson.JsonSyntaxException: java.lang.IllegalStateException: Erwartet BEGIN_ARRAY aber war STRING in Zeile 1 Spalte 268 Pfad $ .menu "
Ich weiß, dass das Menü und die Berechtigung leer ist, wenn die Anmeldung falsch ist. Aber wie kann ich die Antwortnachricht "Falsche Anmeldung" abfangen? Gibt es einen Teil des Codes, den ich ändern muss?
Vielen Dank im Voraus
Vielen Dank, du löst mein Problem. Für jetzt benutze ich [], möglicherweise ändern Sie die Antwort ist auch eine gute Idee. Danke übrigens, –