2017-02-01 1 views
0

내 앱에서 로그 아웃해야합니다.Android에서 Retrofit을 사용하여 로그 아웃

이 내 php 스크립트입니다

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

내가 로그 아웃을위한 버튼이 있습니다 :이 POST 매개 변수를 사용하여 API를 호출

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); 
} 

입니다.

@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); 
} 

디버그 후 :

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

을 그리고 내 응용 프로그램도 SnackBar을 던졌습니다 :

ApiResponse result = response.body(); 

방법 response.body() 예외 :

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

그러나 일부

메시지 Missing required parameter 및 앱이 로그 아웃하지 않습니다.

POST 방법을 사용하여 로그 아웃 할 수있는 방법은 무엇입니까? 여기서 무엇을 할 수 있습니까?

답변

0

나는 당신이 로그 아웃에 대한 API 호출을하기 전에 환경 설정을 삭제하는 경우 확인하시기 바랍니다

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

에 "토큰"값을 얻을 수있다 생각합니다.

+0

아, 저도 그렇게 생각합니다. 로그 아웃을 위해 로그인 사용자의 토큰을 설정하는 방법은 무엇입니까? –

+0

서버의 스크립트에서 토큰 값 앱 측을 추적하셨습니까? logoutAction (Request $ request) –

+0

토큰에 관한 것입니다. 결과에서 Token은 null입니다.'result.getData(). getToken()'은 null입니다. 그러나'response.body' 결과를 보여줍니다. –

0

내 실수 : @Body 대신 @query()을 구문 분석하려고합니다. 나는 token 형식 json에 제출해야

:

내가 내 probelm을 해결하는 방법입니다.

을 이제 POST 방법을 사용하여 API 호출을 같은 :

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

TokenJsonObject 모델 클래스 : 마지막으로

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; 
    } 
} 

그리고, sign_out 버튼 한 후 다음과 같이 그래서, 난 사용하여 내 로그 아웃 API를 구현 클릭 :

@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); 
} 
관련 문제