【问题标题】:How to send Token in Header to server in Android如何将标头中的令牌发送到Android中的服务器
【发布时间】:2017-09-19 06:21:09
【问题描述】:

在我的应用程序中,我想创建一个登录/注册页面。

在登录页面中,我将用户名密码令牌从客户端发送到服务器。

我应该从USER获取UsernamePassword,并从Request的HEADER获取Token

为了将客户端连接到服务器,我使用 Retorfit 2.2.0 库。

接口类的代码:

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

Activity 中的代码:

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

然后在 LogCat 中给我看这个:

tokenTAG: Token : null
tokenTAG: Token : MKGKFPOVRMU4MRK0STNDO20RA2MPEWT7Y1N2WUM5QLIXJX2TEOM9APGUTYJMD8R42WFVESD8GRXCTCINA2LZKU7JV2I7KA2R4N5W

但是当我想用这个代码发送令牌时:Call&lt;LoginResponse&gt; call = api.getLoginResponse(sendToken, loginDatum); 它显示我 null

我已经使用这行:Call&lt;LoginResponse&gt; call = api.getLoginResponse(sendToken, loginDatum); 来生成请求回调,虽然这行 Token 不是 NUll

我该如何解决?

【问题讨论】:

  • 你可以用断点调试它来检查值是空还是非
  • 你在哪里初始化了 sendToken 变量。在行:Call call = api.getLoginResponse(sendToken, loginDatum);你的 sendToken 为空。

标签: android retrofit retrofit2


【解决方案1】:

如果你使用 Retrifit 获取 onNetwork 请求,为了给你的请求添加 Header,你必须编写一个 Intercepter。

【讨论】:

    【解决方案2】:

    只需用这个替换 getClient 方法

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

    让我知道这个解决方案是否有效

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-14
      • 2018-06-01
      • 1970-01-01
      • 2022-01-21
      • 2020-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多