У меня проблема с отправкой токена в шапке и получением информации с сайта после авторизации.
Вот мой 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();
Как я могу сделать это из этой деятельности? Что мне нужно изменить/добавить в мой код?
Я создал 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);
Вы можете создать перехватчик 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
, будет добавлен заголовок авторизации автоматически на все вызовы. Вы можете сохранить свою пользовательскую сессию в общих настройках или сохранить ее в памяти.
Я отправляю токен в заголовке следующим образом:
это класс 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");
Activity.token
когда токен определен какpublic static String token
у меня не работает