2017-02-01 19 views
0

私のアプリからログアウトする必要があります。AndroidでRetrofitを使用してログアウト

これは私のphpスクリプトです:

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

これはPOSTパラメータを使用して、API呼び出しです:

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

私はログアウト用のボタンがあります。

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

しかし、一部では:デバッグした後

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

ApiResponse result = response.body(); 

方法response.body()例外:

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

そして、私のアプリでもSnackBarをスローしますメッセージMissing required parameterとアプリはログアウトしません。

POSTメソッドを使用してログアウトするにはどうすればよいですか?ここで何ができますか?

答えて

0

は、私はあなたがログアウトのためのAPI呼び出しを行う前に、環境設定をクリアしているかどうかを確認してください

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

の「トークン」の値を取得していないかもしれないと思います。

+0

ああ、私もそうだと思います。ログアウトのためのログインユーザのトークンを設定するためのアイデアはありますか? –

+0

サーバ上のスクリプトのトークン値のアプリ側も同様にトレースしました 'logoutAction(Request $ request)' –

+0

トークンに関するすべてです。トークンは結果としてnullです。 'result.getData()。getToken()'はnullになります。しかし、 'response.body'は結果を表示します。 –

0

私の間違い:@Bodyの代わりに@query()を解析しようとしています。

これは私が私のprobelmを解決する方法である:

私はtokenjsonでフォーマットを提出する必要があります。 sign_outボタン後

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

そして最後に、:

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

TokenJsonObjectモデルクラス:

を今のように、POST方法を使用してAPI呼び出しを次のように、私が使用して私のログアウト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); 
} 
関連する問題