2017-11-17 2 views
0

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

Antwort

1

Das Problem ist Ihre privilege Schlüssel.

Bei Erfolg ist es ein Array: "privilege": [ { "module": "menu_a" }, { "module": "menu_b" } ]

In Ausfall ist ein String: „Privileg“: „none“

Ein einfacher Weg, um es wäre funktioniert "none"-[]

zu ändern

Das Problem liegt in Ihrem JSON-Deserializer (GSON?), Der offensichtlich nicht sowohl einen String als auch ein Array auf die gleiche Weise darstellen kann.

Wenn Sie also die Serverantwort nicht ändern können, müssen Sie höchstwahrscheinlich einen benutzerdefinierten Deserializer erstellen, der die Konvertierung für Sie vornehmen kann. Wie das geht, hängt davon ab, was zur Konvertierung von JSON nach Java verwendet wird.

+0

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, –

Verwandte Themen