왕현성
코딩발자취
왕현성
전체 방문자
오늘
어제
  • 코딩 (277)
    • Python (71)
    • Java (16)
    • MySQL (34)
    • 인공지능 (48)
      • 머신러닝 (16)
      • 딥러닝 (32)
    • 영상처리 (4)
    • Rest API (21)
    • Android Studio (25)
    • streamlit (13)
    • DevOps (22)
      • AWS (9)
      • PuTTY (5)
      • Git (4)
      • Serverless (2)
      • Docker (2)
    • IT 기술 용어 (6)
    • 디버깅 ( 오류 해결 과정 ) (17)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 컴퓨터비전
  • PIL
  • yolov8
  • maskimage
  • numpy
  • OpenCV
  • labelme
  • pip install labelme
  • unsupervised
  • 기상탐사
  • encoding='utf-8'
  • alibidetect
  • labelme UnocodeDecodeError
  • tune()
  • 영상기술
  • imageprocessing
  • pytorch
  • 딥러닝
  • PYTHON
  • 영상처리
  • TensorFlow
  • alibi-detection
  • 영상처리역사
  • ckpt_file
  • matplotlib
  • 의료이미징
  • get_long_description
  • ComputerVision
  • 비지도학습
  • UnboundLocalError

최근 댓글

최근 글

티스토리

250x250
hELLO · Designed By 정상우.
왕현성

코딩발자취

Android Studio

Android - 네트워크 통신 Retrofit2 Library

2023. 2. 9. 16:00
728x90

1. Retrofit2 라이브러리 사용을 위한 설정 방법

 

1. 모듈 추가 build.gradle

dependencies {
    implementation 'com.squareup.retrofit2:retrofit:2.9.0'
    implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
    implementation("com.squareup.okhttp3:logging-interceptor:4.9.0")
}

2. 기본 설정 ( NetworkClient 클래스 )

 

이건 이해하는 것보다는 복사해서 쓰는 것이 편하다.

주의해야 할 부분은 Config.DOMAIN 부분만 자신의 API URL로 변경하면 된다.

보통은 보안상의 이유로(키 값, 시크릿 키 값 노출) 다른 클래스에 저장하여 비공개로 두는 경우가 많다.

API 서버를 설정하는 단계라고 보면 된다.

public class NetworkClient {

    public static Retrofit retrofit;
    public static Retrofit getRetrofitClient(Context context){
        if(retrofit == null){
            // 통신 로그 확인할 때 필요한 코드
            HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
            loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);

            // 네트워크 연결관련 코드
            OkHttpClient httpClient = new OkHttpClient.Builder().connectTimeout(1, TimeUnit.MINUTES)
                    .readTimeout(1,TimeUnit.MINUTES).writeTimeout(1,TimeUnit.MINUTES).
                    addInterceptor(loggingInterceptor).build();
            // 네트워크로 데이터를 보내고 받는 레트로핏 라이브러리 관련 코드
            retrofit = new Retrofit.Builder().baseUrl(Config.DOMAIN).client(httpClient).addConverterFactory(GsonConverterFactory.create()).build();

        }
        return retrofit;
    }

}

2. Retrofit2 라이브러리를 이용한 POST로 API 호출하여 처리하는 방법

 

  • 파라미터에 바디(@Body)를 사용, PUT/POST는 바디를 사용
    • 주의! 요청과 응답도 모두 바디로 사용하므로 혼동하면 안된다!!! (내가 그랬음)
  • 사용자가 서버에 데이터를 추가하거나 정보를 입력 할 때 사용 (회원가입, 글쓰기 등)
  • 예시 API서버에서의(로그인 기능) POST 메소드 필수 파라미터
    • Body : email, password
      • 소스 코드에서는 User클래스의 user객체를 이용하여 email과 password의 값을 대체하였다.
btnLogin.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String email = editEmail.getText().toString().trim();
                Pattern pattern = Patterns.EMAIL_ADDRESS;
                if(pattern.matcher(email).matches()==false){
                    Toast.makeText(LoginActivity.this,"이메일 형식이 올바르지않습니다.",Toast.LENGTH_SHORT).show();
                    return;
                }
                // 비밀번호 체크
                String password = editPassword.getText().toString().trim();
                if(password.length()<4 || password.length()>12){
                    Toast.makeText(LoginActivity.this, "비밀번호 길이를 확인하세요.", Toast.LENGTH_SHORT).show();
                    return;
                }

                showProgress("로그인 중입니다...");

                Retrofit retrofit = NetworkClient.getRetrofitClient(LoginActivity.this);
                UserApi api = retrofit.create(UserApi.class);

                User user = new User(email,password);

                Call<UserRes> call = api.login(user);
                call.enqueue(new Callback<UserRes>() {
                    @Override
                    public void onResponse(Call<UserRes> call, Response<UserRes> response) {
                        dismissProgress();
                        if(response.isSuccessful()){

                            UserRes res = response.body();

                            // 억세스 토큰을 api할 때마다 헤더에서 사용하므로
                            // 회원가입이나 로그인이 끝나면 파일로 꼭 저장해놔한다.
                            SharedPreferences sp = getApplication().getSharedPreferences(Config.PREFERENCE_NAME,MODE_PRIVATE);
                            SharedPreferences.Editor editor = sp.edit();
                            editor.putString(Config.ACCESS_TOKEN,res.getAccess_token());
                            editor.apply();

                            Intent intent = new Intent(LoginActivity.this,MainActivity.class);

                            startActivity(intent);

                            finish();

                        }else if(response.code() == 400){

                            Toast.makeText(LoginActivity.this, "회원가입이 되어있지 않거나 비밀번호가 틀렸습니다.", Toast.LENGTH_SHORT).show();
                            return;
                        }else{
                            Toast.makeText(LoginActivity.this, "정상적으로 처리되지 않았습니다.", Toast.LENGTH_SHORT).show();
                            return;
                        }

                    }

 

3. Retrofit2 라이브러리를 이용한 GET으로 API 호출하여 처리하는 방법

  • 파라미터에 쿼리(@Query)를 사용, GET/DELETE는 쿼리스트링 사용
    • 하위 경로 뒤에 '?키=밸류' 로 구성, 예시) /posting?page=1
  • 보통은 게시판의 목록을 보여주는 기능으로 사용
  • 예시 API서버에서의(내 포스팅 보기 기능) GET 메소드 필수 파라미터
    • Header : 인증키(Authorization)
    • Query : 페이지 번호
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 억세스 토큰이 저장되어있으면 로그인한 유저이므로 메인액티비티를 실행하고


        // 그렇지 않으면 회원가입 액티비티를 실행하고 메인 액티비티는 종료!
        SharedPreferences sp = getSharedPreferences(Config.PREFERENCE_NAME, MODE_PRIVATE);
        accessToken = sp.getString(Config.ACCESS_TOKEN, "");
        if (accessToken.isEmpty()) {
            Intent intent = new Intent(MainActivity.this, RegisterActivity.class);
            startActivity(intent);
            finish();
            return;
        }
        // 회원가입 / 로그인 유저면 아래 코드를 실행하도록 둔다.
        btnAdd = findViewById(R.id.btnAdd);
        progressBar = findViewById(R.id.progressBar);

        recyclerView = findViewById(R.id.recyclerView);
        recyclerView.setHasFixedSize(true);
        recyclerView.setLayoutManager(new LinearLayoutManager(MainActivity.this));

        // 네트워크로부터 메모를 가져온다.
        getNetworkData();


    }

    private void getNetworkData() {
        // 1. progressBar를 보여준다.
        progressBar.setVisibility(View.VISIBLE);
        // 2. Retrofit을 만든다.
        Retrofit retrofit = NetworkClient.getRetrofitClient(MainActivity.this);
        // 3. API를 만든다 => api 패키지에 MemoApi 생성 후 코드 작업
        MemoApi api = retrofit.create(MemoApi.class);

        Call<MemoList> call = api.getMemoList("Bearer "+accessToken, 0, 20);

        call.enqueue(new Callback<MemoList>() {
            @Override
            public void onResponse(Call<MemoList> call, Response<MemoList> response) {
                progressBar.setVisibility(View.GONE);
                if(response.isSuccessful()){
                    // 정상적으로 데이터 받았으니, 리사이클러뷰에 표시시
                   MemoList memoList = response.body();

                   memoArrayList.addAll(memoList.getItems());
                   adapter = new MemoAdapter(MainActivity.this,memoArrayList);
                   recyclerView.setAdapter(adapter);




                }else{
                    Toast.makeText(MainActivity.this, "서버에 문제가 있습니다.", Toast.LENGTH_SHORT).show();
                    return;
                }
            }

            @Override
            public void onFailure(Call<MemoList> call, Throwable t) {
                progressBar.setVisibility(View.GONE);

            }
        });
    }

 

3. Retrofit2 라이브러리를 이용한 RecyclerView화면 처리하는 방법

 

if(response.isSuccessful()){
                    // 정상적으로 데이터 받았으니, 리사이클러뷰에 표시시
                   MemoList memoList = response.body();

                   memoArrayList.addAll(memoList.getItems());
                   adapter = new MemoAdapter(MainActivity.this,memoArrayList);
                   recyclerView.setAdapter(adapter);

'Android Studio' 카테고리의 다른 글

Android - Retrofit Multipart 사용 방법, 파일 업로드하기  (0) 2023.02.14
Android - 카메라와 사진첩을 이용하여 이미지 뷰에 사진 출력하기  (0) 2023.02.13
Android - ProgressDialog  (0) 2023.02.09
Android - recyclerView 페이징 처리 (recyclerView.addOnScrollListener)  (0) 2023.02.08
Android - Intent 활용 - 주소록, 웹페이지, 메시지, 이메일  (0) 2023.02.07
    'Android Studio' 카테고리의 다른 글
    • Android - Retrofit Multipart 사용 방법, 파일 업로드하기
    • Android - 카메라와 사진첩을 이용하여 이미지 뷰에 사진 출력하기
    • Android - ProgressDialog
    • Android - recyclerView 페이징 처리 (recyclerView.addOnScrollListener)
    왕현성
    왕현성
    AI 머신비전 학습일지

    티스토리툴바