2017-02-01 6 views
0

Ich muss mich aus meiner App ausloggen.Logout mit Retrofit in Android

Das ist mein php Skript:

public function logoutAction(Request $request){ 
    $requestData=json_decode($request->getContent(),1); 
    $em=$this->get('doctrine')->getEntityManager(); 
    if(isset($requestData['token'])){ 
     if($userToken=$em->getRepository('NavZUserBundle:UserToken')->findOneBy(array('token'=>$requestData['token']))){ 
      $em->remove($userToken); 
      $em->flush($userToken); 
      $response['status']='success'; 
      $response['msg']="Logged out successfully"; 
     }else{ 
      $response['status']='fail'; 
      $response['msg']="Mobile User is already logged out"; 
     } 
    }else{ 
     $response['status']='fail'; 
     $response['msg']="Missing required parameter"; 
    } 
    return new JsonResponse($response); 
} 

Dies ist api-Aufruf POST Parameter:

@POST("api/logout/") 
Call<ApiResponse> logOutUser(@Query("token") String token); 

Ich habe Taste Abmelden.

@OnClick(R.id.tv_signout) 
void onSignOut(View view) { 
    logOutMethod(); 
} 
private void logOutMethod() { 
    ApiService apiService = RestClient.getClient(); 
    Call<ApiResponse> logOut = apiService.logOutUser(getPreference().getToken()); 
    Log.e(TAG, "logOutMethod one: "+getPreference().getToken()); 
    Log.e(TAG, "logOutMethod two: "+logOut); 
    logOut.enqueue(new Callback<ApiResponse>() { 
     @Override 
     public void onResponse(Response<ApiResponse> response) { 
      if (response.isSuccess()){ 
       ApiResponse result = response.body(); 
       if (result.getData() != null){ 
        goToLogInActivity(); 
        Snackbar.make(findViewById(android.R.id.content), result.getMsg(), Snackbar.LENGTH_LONG).show(); 
       }else { 
        Snackbar.make(findViewById(android.R.id.content), result.getMsg(), Snackbar.LENGTH_LONG).show(); 
       } 
      }else { 
       Snackbar.make(findViewById(android.R.id.content), response.message(), Snackbar.LENGTH_LONG).show(); 
      } 
     } 

     @Override 
     public void onFailure(Throwable t) { 

     } 
    }); 
} 
private void goToLogInActivity(){ 
    getPreference().removeLoginPreferences(); 
    Intent intent = new Intent(this, LoginActivity.class); 
    finish(); 
    intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION); 
    overridePendingTransition(0, 0); 
    startActivity(intent); 
} 

Nach debug:

E/SettingsActivity: logOutMethod one: f7177163c833dff4b38fc8d2872f1ec658940cbf280ce 
E/SettingsActivity: logOutMethod two: [email protected]8 

Aber teilweise:

ApiResponse result = response.body(); 

Verfahren response.body() wirft:

data = null 
msg = "Missing required parameter" 
status = "fail" 

Und in meiner app wirft auch SnackBar Nachricht Missing required parameter und App wird nicht abgemeldet.

Was kann ich für die Abmeldung mit der POST-Methode tun? Was kann hier gemacht werden?

Antwort

0

Ich denke, man kann nicht auf „Token“ Wert erhalten

Call<ApiResponse> logOut = apiService.logOutUser(new PreferenceTypes(this).getToken()); 

Bitte überprüfen Sie, ob Sie die Einstellungen räumen, bevor API-Aufruf zur Abmeldung zu machen.

+0

Ahhh, ich denke auch das. Irgendeine Idee, das Token des Login-Benutzers für die Abmeldung einzurichten? –

+0

Haben Sie die Token-Wert App-Seite auch im Skript auf dem Server in der Zeile verfolgen 'logoutAction (Request $ Anfrage)' –

+0

Es geht um Token. Token ist null im Ergebnis: 'result.getData(). GetToken()' ergibt NULL. Aber "response.body" zeigt das Ergebnis an. –

0

Mein Fehler: Ich versuche, die @query() statt @Body zu analysieren.

Dies ist, wie ich mein Probelm gelöst:

ich die token in json Format einreichen. So implementieren ich meine Log Out-API wie folgt:

nun die API-Aufruf POST Methode wie:

@POST("/api/logout/") 
Call<ApiResponse> logOutUser(@Body TokenJsonObject tokenJsonObject); 

TokenJsonObject Modellklasse:

public class TokenJsonObject { 

    public TokenJsonObject(String token) { 
     this.token = token; 
    } 

    @SerializedName("token") 
    private String token; 

    public String getToken() { 
     return token; 
    } 

    public void setToken(String token) { 
     this.token = token; 
    } 
} 

Und schließlich Nach sign_out Taste Klick:

@OnClick(R.id.tv_signout) 
void onSignOut(View view) { 
    logOutMethod(); 
} 

private void logOutMethod() { 
    ApiService apiService = RestClient.getClient(); 
    Call<ApiResponse> logOut = apiService.logOutUser(new TokenJsonObject(getPreference().getToken())); 
    logOut.enqueue(new Callback<ApiResponse>() { 
     @Override 
     public void onResponse(Response<ApiResponse> response) { 
      if (response.isSuccess()) { 
       ApiResponse result = response.body(); 
       if (result.getData() != null) { 
        Snackbar.make(findViewById(android.R.id.content), result.getMsg(), Snackbar.LENGTH_LONG).show(); 
       } else { 
        goToLogInActivity(); 
        Snackbar.make(findViewById(android.R.id.content), result.getMsg(), Snackbar.LENGTH_LONG).show(); 
       } 
      } else { 
       Snackbar.make(findViewById(android.R.id.content), response.message(), Snackbar.LENGTH_LONG).show(); 
      } 
     } 

     @Override 
     public void onFailure(Throwable t) { 

     } 
    }); 
} 

private void goToLogInActivity() { 
    getPreference().removeLoginPreferences(); 
    Intent intent = new Intent(this, LoginActivity.class); 
    finish(); 
    intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION); 
    overridePendingTransition(0, 0); 
    startActivity(intent); 
}