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
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions