2017-09-19 9 views
1

私のアプリケーションでは、ログイン/ページを作成します。ログインページでトークンをAndroidのサーバーに送信する方法

私は、クライアントからサーバへのトークンユーザー名パスワードを送ります。

私はUSERからユーザー名パスワードを取得し、要求のHEADERからトークンを取得する必要があります。

クライアントとサーバーの接続には、Retorfit 2.2.0ライブラリを使用します。インターフェイスクラスから

コード:活動中の

@POST("User/Authenticate") 
Call<LoginResponse> getLoginResponse(@Header("Token") String token, @Body LoginDatum loginDatum); 

コード:LogCatで

public void getLogin(String username, String password) { 

    final LoginDatum loginDatum = new LoginDatum(); 
    loginDatum.setUsername(username); 
    loginDatum.setPassword(password); 

    InterfaceApi api = ApiClient.getClient().create(InterfaceApi.class); 
    Call<LoginResponse> call = api.getLoginResponse(sendToken, loginDatum); 

    Log.e("tokenTAG", "Token : " + sendToken); 

    call.enqueue(new Callback<LoginResponse>() { 
     @Override 
     public void onResponse(Call<LoginResponse> call, Response<LoginResponse> response) { 
      LoginResponse loginResponse = response.body(); 
      String token = response.headers().get("Token"); 
      if (token != null) { 
       sendToken = token; 
       Log.e("tokenTAG", "Token : " + sendToken); 
      } 
      if (loginResponse.getStatusCode() == 200) { 
       Toasty.success(context, context.getResources().getString(R.string.welcome) + " " + 
         loginResponse.getData().getName(), Toast.LENGTH_LONG, true).show(); 
      } else { 
       Toasty.error(context, loginResponse.getStatusMessage() + "", Toast.LENGTH_LONG, true).show(); 
      } 
      loadProgress.get(0).setVisibility(View.GONE); 
      loginBtn.setVisibility(View.VISIBLE); 
      btnShadow.setVisibility(View.VISIBLE); 
     } 

     @Override 
     public void onFailure(Call<LoginResponse> call, Throwable t) { 
      loadProgress.get(0).setVisibility(View.GONE); 
      loginBtn.setVisibility(View.VISIBLE); 
      btnShadow.setVisibility(View.VISIBLE); 
      Toasty.error(context, context.getResources().getString(R.string.failRequest), 
        Toast.LENGTH_LONG, true).show(); 
     } 
    }); 
} 

そして、私にこれを示しています

tokenTAG: Token : null 
tokenTAG: Token : MKGKFPOVRMU4MRK0STNDO20RA2MPEWT7Y1N2WUM5QLIXJX2TEOM9APGUTYJMD8R42WFVESD8GRXCTCINA2LZKU7JV2I7KA2R4N5W 

しかし、私はこのコードでトークンを送信したいとき:Call<LoginResponse> call = api.getLoginResponse(sendToken, loginDatum);それは私にnullを示しています。

私はこの行:Call<LoginResponse> call = api.getLoginResponse(sendToken, loginDatum);を要求コールバックを生成するために使用しましたが、この行のトークンはではなく、NUllです。

どうすれば修正できますか?

+0

これをブレークポイントでデバッグして、値がnullかnoかを確認することができます – Raghunandan

+0

どこでsendToken変数を初期化しましたか?行で:Call call = api.getLoginResponse(sendToken、loginDatum);あなたのsendTokenはnullです。 –

答えて

-1

だけgetClientあなたは、あなたのrequeseにヘッダーを追加するために、あなたはRetrifitを使用している場合、私は、要求をonNetwork取得

0

をこのソリューションが動作するかどうか知っているか、してはならないしましょう。この1

public static Retrofit getClient(final Context context) { 
     if (retrofit == null) { 
      Log.d("AuthTokenTest", "getClient: null"); 

      OkHttpClient.Builder httpClient = new OkHttpClient.Builder(); 

      dispatcher = new Dispatcher(); 
      httpClient.dispatcher(dispatcher); 

      httpClient.addInterceptor(new Interceptor() { 
       @Override 
       public Response intercept(Interceptor.Chain chain) throws IOException { 
        Request original = chain.request(); 
        Log.d("INTERCEPTOR", original.url().toString()); 
        //System.out.print(original.toString()); 
        Request request; 
        user=User.getLoggedInUserInstance(context); 
        String authToken=""; 

        if(user!=null) 
         authToken=user.getAuthToken(); 
        Log.d("AuthTokenTest", "intercept: authtoken:"+authToken); 

        request = original.newBuilder() 
          .header("X-AUTH-TOKEN", authToken) 
          .header("x-requested-with", "XMLHttpRequest") 
          .method(original.method(), original.body()) 
          .build(); 

        okhttp3.Response response = chain.proceed(request); 

        Log.d("INTERCEPTOR-", "response_code: "+response.code()); 

//     Log.d("INTERCEPTOR", response.body().string()); 
        return response; 

       } 
      }); 

      HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor(); 
      if(BuildConfig.DEBUG){ 
       //print the logs in this case 
       loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY); 
      }else{ 
       loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.NONE); 
      } 

      httpClient.addInterceptor(loggingInterceptor); 

      OkHttpClient client = httpClient.build(); 

      Gson gson = new GsonBuilder() 
        .excludeFieldsWithModifiers(Modifier.TRANSIENT) 
        .setLenient() 
        .create(); 

      retrofit = new Retrofit.Builder() 
        .baseUrl(BASE_URL) 
        .client(client) 
        .addConverterFactory(GsonConverterFactory.create(gson)) 
        .build(); 
     } 
     return retrofit; 
    } 

でmenthod置き換えますインタセプターを書いてください。

関連する問題