개발학습일지

[Android Studio] 네트워크로 form-data 보내는 방법 _ retrofit2 본문

Android Studio

[Android Studio] 네트워크로 form-data 보내는 방법 _ retrofit2

처카푸 2024. 6. 17. 13:28

네트워크로 form-data 보내는 방법 _ retrofit2

 

포스트맨의 생성 API를 보고,  앱 API 만들기

- form-data의 File과 Text 받는 API 코드 작성

- @Multipart

- 사진 = @Part MultipartBody.Part

- 텍스트 = @Part(" ")RequestBody

public interface PostingApi {

    @Multipart
    @POST("/post")
    Call<Res> addPosting(@Header("Authorization") String token,
                         @Part MultipartBody.Part photo,
                         @Part("comment")RequestBody content);
}

 

네트워크 호출하는 코드 작성

        btnSave.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // 1. 파일이 있어야 하고,
                // 2. 내용이 있어야 한다.
                String content = editContent.getText().toString().trim();
                if(photoFile == null||content.isEmpty()){
                    Snackbar.make(btnSave, "사진과 내용 모두 입력해주세요.", Snackbar.LENGTH_SHORT).show();
                    return;
                }

                // 레트로핏 라이브러리 이용해서 네트워크로 호출한다.
                // 프로그레스바 키기
                showProgress();

                Retrofit retrofit = NetworkClient.getRetrofitClient(AddActivity.this);
                // API 만들고 와서 마저 작성
                PostingApi api = retrofit.create(PostingApi.class);

                // 저장되어 있는 토큰 가져오기
                SharedPreferences sp = getSharedPreferences(Config.SP_NAME, MODE_PRIVATE);
                String token = sp.getString("token","");

                // 보낼 파일 만들기
                RequestBody fileBody = RequestBody.create(photoFile, MediaType.parse("image/jpeg"));
                // createFormData(포스트맨 파일 키값, 만든 변수 photoFile의 이름, fileBody)
                // 파일이 너무 커서 나눠서 보내기 위해, Part를 사용한다.
                MultipartBody.Part photo = MultipartBody.Part.createFormData("photo", photoFile.getName(), fileBody);

                // 보낼 텍스트 만들기
                // create(입력받은 텍스트 변수, 텍스트 타입)
                RequestBody textBody = RequestBody.create(content, MediaType.parse("text/plain"));

                Call<Res> call = api.addPosting("Bearer "+token, photo, textBody);

                call.enqueue(new Callback<Res>() {
                    @Override
                    public void onResponse(Call<Res> call, Response<Res> response) {
                        // 프로그레스바 끄기
                        dismissProgress();
                        if(response.isSuccessful()){
                            Toast.makeText(AddActivity.this, "포스트 성공", Toast.LENGTH_SHORT).show();
                            finish();
                        }else{
                        }
                    }
                    @Override
                    public void onFailure(Call<Res> call, Throwable throwable) {
                        // 프로그레스바 끄기
                        dismissProgress();
                        Toast.makeText(AddActivity.this, "포스트 생성 실패", Toast.LENGTH_SHORT).show();
                        return;
                    }
                });
            }
        });

 

 


*위에 코드에서 사용하는 showProgress() dialog 코드

    Dialog dialog;
    void showProgress(){
        dialog = new Dialog(this);
        dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
        dialog.setContentView(new ProgressBar(this));
        dialog.setCancelable(false);
        dialog.setCanceledOnTouchOutside(false);
        dialog.show();
    }
    void dismissProgress(){
        dialog.cancel();
    }