Skip to content

"사용자의 데이터 반환 API"에 요청한 데이터를 앱(유저프로필)에서 보여주기 👤  #9

@Kumushai9919

Description

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

Screenshot 2023-04-11 at 11 07 05 PM

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

Screenshot 2023-04-11 at 11 08 34 PM

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

Screenshot 2023-04-11 at 11 25 09 PM

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 파라매터들:

Screenshot 2023-04-11 at 11 14 29 PM

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

Screenshot 2023-04-11 at 11 15 33 PM

  • UserProfileResponse 클래스:
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;
    }

}
  • 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
}
  • CoordinateResponse 클래스:
package com.example.stylerent.userdata;

public class CoordinateResponse {
    private double latitude;
    private double longitude;

    // constructor, getters and setters
}

  • rank 클래스:
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 포맷을 사용하여 보여줬습니다

Screenshot 2023-04-11 at 11 22 01 PM

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로 요청한 다음 사용자 데이터를 응답으로 받고, 그 응담에서 사용자 이름과 사진을 보여주도록 했습니다

Screenshot 2023-04-11 at 11 27 35 PM

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions