- 백엔드에서 다음과 같은 사용자의 데이터 반환하는 API를 받았습니다.

- 먼저 우리가 로그인과 회원가입 했던 것처럼 Retrofit을 사용하여 서버에 요청해야 하는데 , 일단 ApiInterface 클래스에서 사용자 데이터를 받기 위해서GET 요청을 했습니다.

- 그 다음에 Retrofit 클래스에서, Brear 과 token을 요청하기 위해서 필요한 코드를 썼습니다. token을 Bear과 같이 보내는 이유가 바로 사용자 token을 보낼 때 먼저 사용자를 인증해야 되는데, 그 때 "Bearer "+ token 형식으로 인증한 다음 사용자의 데이터를 반환해줍니다.
- 참고로 Bearer token 개념 ->

package com.example.stylerent.auth;
import android.content.Context;
import android.content.SharedPreferences;
import java.io.IOException;
import okhttp3.Interceptor;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
public class RetrofitClient {
public static Retrofit retrofit;
public static Retrofit getRetrofitInstance(Context context){
if(retrofit == null) {
OkHttpClient client = new OkHttpClient.Builder()
.addInterceptor(new AuthInterceptor(context))
.build();
retrofit = new Retrofit.Builder()
.baseUrl("http://222.105.43.106:3000")
.addConverterFactory(GsonConverterFactory.create())
.build();
retrofit = retrofit.newBuilder().client(client).build();
}
return retrofit;
}
// a custom Interceptor adds the Bearer token to the header of all requests:
private static class AuthInterceptor implements Interceptor {
public static final String MyPREFERENCES = "MyPrefs";
SharedPreferences sharedPreferences;
AuthInterceptor(Context context){
sharedPreferences = context.getSharedPreferences(MyPREFERENCES, Context.MODE_PRIVATE);
}
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
// Get the authorization token from SharedPreferences
String TOKEN = sharedPreferences.getString("TOKEN", "");
//Add the token to the request header
Request authorizedRequest = request.newBuilder()
.header("Authorization", "Bearer " + TOKEN)
.build();
return chain.proceed(authorizedRequest);
}
}
}
- 백엔드에서 받은 사용자의 API 토대로 -> 사용자의 정보 기본 클래스들을 만들었습니다:
- 백엔드에서 받은 API 파라매터들:

- API 토대로 만든 사용자 클래스들(참고로 "userdata" package를 만들어 안에 모든 클래스 놓었습니다):

package com.example.stylerent.userdata;
import java.util.List;
public class UserProfileResponse {
private Integer userid;
private String username;
private String email;
private String phonenumber;
private Integer averageRank;
private List<Rank> receivedRank;
private List<Rank> marks;
public Integer getUserid() {
return userid;
}
public String getUsername() {
return username;
}
public String getEmail() {
return email;
}
public String getPhonenumber() {
return phonenumber;
}
public Integer getAverageRank() {
return averageRank;
}
public List<Rank> getReceivedRank() {
return receivedRank;
}
public List<Rank> getMarks() {
return marks;
}
public CoordinateResponse getCoordinateResponse() {
return coordinateResponse;
}
public ImageResponse getImageResponse() {
return imageResponse;
}
private CoordinateResponse coordinateResponse;
private ImageResponse imageResponse;
public UserProfileResponse(Integer userid, String username, String email, String phonenumber, Integer averageRank, List<Rank> receivedRank, List<Rank> marks, CoordinateResponse coordinateResponse, ImageResponse imageResponse) {
this.userid = userid;
this.username = username;
this.email = email;
this.phonenumber = phonenumber;
this.averageRank = averageRank;
this.receivedRank = receivedRank;
this.marks = marks;
this.coordinateResponse = coordinateResponse;
this.imageResponse = imageResponse;
}
}
package com.example.stylerent.userdata;
public class ImageResponse {
private String imageByte;
public ImageResponse(String imageByte) {
this.imageByte = imageByte;
}
public String getImageByte() {
return imageByte;
}
// constructor, getters and setters
}
package com.example.stylerent.userdata;
public class CoordinateResponse {
private double latitude;
private double longitude;
// constructor, getters and setters
}
package com.example.stylerent.userdata;
public class Rank {
public Integer id;
public Integer userid;
public Integer recieverid;
public String error;
public Rank(Integer id, Integer userid, Integer recieverid, String error) {
this.id = id;
this.userid = userid;
this.recieverid = recieverid;
this.error = error;
}
public Integer getId() {
return id;
}
public Integer getUserid() {
return userid;
}
public Integer getRecieverid() {
return recieverid;
}
public String getError() {
return error;
}
}
- 그 다음에 UserFragment에서 사용자의 토컨을 받고 , 서버에 (“Bearer”+ TOKEN)으로 요청 보내고 → response 응답을 받았습니다.
- 현재까지 사용자의 이름과 사진을(참고로 사진을 지금 postman에서만 추가했고) 보여주도록 했습니다. 사진을 Base64 포맷을 사용하여 보여줬습니다

package com.example.stylerent.fragments;
import static android.content.ContentValues.TAG;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.SharedPreferences;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import androidx.fragment.app.Fragment;
import android.util.Base64;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.TextView;
import com.example.stylerent.R;
import com.example.stylerent.auth.ApiInterface;
import com.example.stylerent.auth.RetrofitClient;
import com.example.stylerent.userdata.UserProfileResponse;
import java.nio.charset.StandardCharsets;
import java.sql.SQLOutput;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
public class UserFragment extends Fragment {
public static final String MyPREFERENCES = "MyPrefs";
SharedPreferences sharedPreferences;
TextView userName;
ImageView userImage;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
sharedPreferences = requireActivity().getSharedPreferences(MyPREFERENCES, Context.MODE_PRIVATE);
}
@SuppressLint("MissingInflatedId")
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_user, container, false);
userName = view.findViewById(R.id.userName);
userImage = view.findViewById(R.id.userImage);
getUserData();
return view;
}
private void getUserData() {
String TOKEN = sharedPreferences.getString("TOKEN", null);
ApiInterface apiInterface = RetrofitClient.getRetrofitInstance(getContext()).create(ApiInterface.class);
Call<UserProfileResponse> userProfileCall = apiInterface.getUserProfile("Bearer" + TOKEN);
userProfileCall.enqueue(new Callback<UserProfileResponse>() {
@Override
public void onResponse(Call<UserProfileResponse> call, Response<UserProfileResponse> response) {
if (response.isSuccessful()) {
UserProfileResponse userProfileResponse = response.body();
// Handle successful user profile response
//user name
userName.setText(userProfileResponse.getUsername());
//user Image
byte[] image = Base64.decode(userProfileResponse.getImageResponse().getImageByte(), Base64.DEFAULT);
System.out.println(userProfileResponse.getImageResponse().getImageByte());
Bitmap bitmap = BitmapFactory.decodeByteArray(image, 0, image.length);
userImage.setImageBitmap(bitmap);
System.out.println(userProfileResponse.getAverageRank());
}
}
@Override
public void onFailure(Call<UserProfileResponse> call, Throwable t) {
// Handle network failure
Log.e(TAG, "Failed to get user data: " + t.getMessage());
}
});
}
}
- user profile에서 API로 요청한 다음 사용자 데이터를 응답으로 받고, 그 응담에서 사용자 이름과 사진을 보여주도록 했습니다


- API 토대로 만든 사용자 클래스들(참고로 "userdata" package를 만들어 안에 모든 클래스 놓었습니다):