2017-02-01 26 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); 

我有按鈕退出。

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

調試後:

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

但部分:

ApiResponse result = response.body(); 

的方法response.body()拋出:

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

而且在我的應用程序也會引發SnackBar消息Missing required parameter和應用程序不會註銷。

我可以使用POST方法註銷嗎?這裏可以做些什麼?

回答

0

我想你可能無法得到

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

「令牌」值請檢查您是否正在API調用註銷之前清除偏好。

+0

啊,我想也是。任何想法設置註銷登錄用戶的令牌? –

+0

你在行 'logoutAction(請求$請求)' –

+0

這是所有關於令牌微量元素對服務器令牌值應用程序方面,以及在腳本中。令牌在結果中爲null:'result.getData()。getToken()'產生空值。但是,'response.body'顯示結果。 –

0

我的錯誤:我試圖解析的@query()代替@Body

這是我如何解決我的萬阿英,蔣達清:

我必須提交tokenjson格式。所以,我使用實現我註銷API如下:

現在,使用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按鈕點擊:

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