Отправить токен в шапке (разные действия)

1

У меня проблема с отправкой токена в шапке и получением информации с сайта после авторизации.

Вот мой MainActivity.java:

    public class MainActivity extends AppCompatActivity {

    public static final String BASE_URL = "https://api.some.some/v1/";

    SomeAPI userClient;
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(BASE_URL)
            .addConverterFactory(GsonConverterFactory.create())
            .build();

    userClient  = retrofit.create(SomeAPI.class);

    login();

    }

    private void login() {
        Auth login = new Auth("123456", "12345678");
        Call<User> call = userClient.login(login);

        call.enqueue(new Callback<User>() {
            @Override
            public void onResponse(Call<User> call, Response<User> response) {
if (response.code() == 201) {
                    Toast.makeText(MainActivity.this, response.body().getToken(), Toast.LENGTH_SHORT).show();
                    token = response.body().getToken();
                }
                else {
                    Toast.makeText(MainActivity.this, "Token is not truth :(", Toast.LENGTH_SHORT).show();
                }
            }

            @Override
            public void onFailure(Call<User> call, Throwable t) {
                Toast.makeText(MainActivity.this, "error!", Toast.LENGTH_SHORT).show();
            }
        });
    }

    }

Вот мой интерфейс API:

public interface SomeAPI {

    @POST("token")
    Call<User> login(@Body Auth login);

}
Here is my Auth.java:

public class Auth {
    private String login;
    private String password;

    public Auth(String login, String password) {
        this.login = login;
        this.password = password;
    }
}

Вот мой User.java:

    public class User {
        private int id;
        private String email;
        private String token;

        public int getId(){
            return id;
        }

        public void setId(){
            this.id = id;
        }
        public String getEmail(){
            return  email;
        }

        public void setEmail(String email){
            this.email = email;
        }
        public String getToken(){return token;}
        public void setToken(String token){this.token = token;}
public String getfirst_name()
    {
        return first_name;
    }
    public void setfirst_name(String first_name) {
        this.first_name = first_name;
    }

    }

Итак, после всего этого у меня есть токен, и теперь я хочу получить некоторую информацию в своей другой деятельности.

Userprofile.java:

    ProstoTVAPI userClient;

        String first_name = "";

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_profile);
            Retrofit retrofit = new Retrofit.Builder()
                    .baseUrl(BASE_URL)
                    .addConverterFactory(GsonConverterFactory.create())
                    .build();

            userClient  = retrofit.create(ProstoTVAPI.class);

            getUserInfo();
    }
        private void getUserInfo() {
            User user = new User();
            Call<User> call = userClient.getInfo();

            call.enqueue(new Callback<User>() {
                @Override
                public void onResponse(Call<User> call, Response<User> response) {
                    if (response.code() == 200){
                            first_name = response.body().getfirst_name();
                            tvName.setText(first_name);


                    }
                    else {
                        Toast.makeText(UserProfile.this, "First name was not loaded", Toast.LENGTH_SHORT).show();

                    }
                }

                @Override
                public void onFailure(Call<User> call, Throwable t) {
                    Toast.makeText(UserProfile.this, "error!", Toast.LENGTH_SHORT).show();
                }
            });
        }

Я должен отправить токен, который я получил после авторизации, чтобы получить новую информацию, например first_name = response.body().getfirst_name();

Как я могу сделать это из этой деятельности? Что мне нужно изменить/добавить в мой код?

UPD:

Я создал PreferencesManager, где я сохраняю свои настройки:

public class PreferencesManager {

    private static final String PREFERENCES = "MyPrefs";
    private static PreferencesManager instance = null;
    private static SharedPreferences sharedPreferences;

    public static PreferencesManager getInstance() {
        if (instance == null) {
            instance = new PreferencesManager();
        }
        return instance;
    }

    private static SharedPreferences getSharedPreferences(Context context) {
        if (sharedPreferences == null) {
            sharedPreferences = context.getSharedPreferences(PREFERENCES, Context.MODE_PRIVATE);
        }
        return sharedPreferences;
    }


    public static void putString(Context context, String key, String value) {
        SharedPreferences sharedPreferences = getSharedPreferences(context);
        SharedPreferences.Editor editor = sharedPreferences.edit();
        editor.putString(key, value).apply();
    }

    public static String getString(Context context, String key, String defValue) {
        SharedPreferences sharedPreferences = getSharedPreferences(context);
        return sharedPreferences.getString(key, defValue);
    }


}

Поэтому в Activity, где я получил токен, я сделал: editor.putString("token", token); где редактор - SharedPreferences.Editor editor;

И в Activity, где я отправил токен в качестве заголовка, я сделал:

    private void getUserInfo() {
            User user = new User();

            Call<User> call = userClient.getInfo("Bearer " + token);
...
}

и в onCreate():

editor = getSharedPreferences("MyPrefs", MODE_PRIVATE).edit();
token = PreferencesManager.getString(this,"token", null);

также я добавил в ApiInterface:

Call<User> getInfo(@Header("Authorization") String token);
Теги:
token
retrofit

2 ответа

1

Вы можете создать перехватчик OkHttpClient для добавления заголовка токена ко всем вызовам:

private static Response intercept(Interceptor.Chain chain) throws IOException
    {
            Request.Builder builder = chain.request().newBuilder()
                    .addHeader("authorization", String.format("%s %s", UserSession.tokenType, UserSession.accessToken));

            return chain.proceed(builder.build());
    }

Затем создайте экземпляр OkHttpClient и добавьте перехватчик:

client = new OkHttpClient.Builder()
                    .cache(cache)
                    .addInterceptor(YourClass::intercept)
                    .build();

И, наконец, создайте свой экземпляр Retrofit:

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

Пока ваш UserSession класс держит tokenType и accessToken, будет добавлен заголовок авторизации автоматически на все вызовы. Вы можете сохранить свою пользовательскую сессию в общих настройках или сохранить ее в памяти.

1

Я отправляю токен в заголовке следующим образом:

это класс ApiInterface: -

Call<ReactionResponse> submitReactionPart(@Header("Authorization") String token);

и это деятельность: -

Call<ReactionResponse> responseCall = apiInterface.submitReactionPart("Bearer " +token);

это мое предпочтение Клаас взглянуть: -

    public class AppPrefrences {

        private static SharedPreferences mPrefs;
        private static SharedPreferences.Editor mPrefsEditor;

        public static boolean isUserLoggedOut(Context ctx) {
            mPrefs = PreferenceManager.getDefaultSharedPreferences(ctx);
            return mPrefs.getBoolean("id_logged_in", true);
        }

        public static void setUserLoggedOut(Context ctx, Boolean value) {
            mPrefs = PreferenceManager.getDefaultSharedPreferences(ctx);
            mPrefsEditor = mPrefs.edit();
            mPrefsEditor.putBoolean("id_logged_in", value);
            mPrefsEditor.commit();
        }

    public static String getUserImage(Context ctx) {
        mPrefs = PreferenceManager.getDefaultSharedPreferences(ctx);
        return mPrefs.getString("userImage", "");
    }

    public static void setUserImage(Context ctx, String value) {
        mPrefs = PreferenceManager.getDefaultSharedPreferences(ctx);
        mPrefsEditor = mPrefs.edit();
        mPrefsEditor.putString("userImage", value);
        mPrefsEditor.commit();
    }

}

в деятельности, где вы хотите использовать значение предпочтения, он вернет строковое значение: -

String userImageUrl = AppPreference.getUserImage(MyActivity.class);

в деятельности, где вы хотите сохранить свою ценность в предпочтениях: -

AppPreference.setUserImage(MyActivity.class, "put your value here");
  • 0
    если у вас есть запрос, оставьте комментарий
  • 0
    Как я могу получить токен из другого занятия? Activity.token когда токен определен как public static String token у меня не работает
Показать ещё 9 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню