본문 바로가기

TOOL/Android Studio

Android Studio - Retrofit에서 Multipart form으로 데이터를 보내는 방법

반응형

 

 

포스트맨을 활용해 데이터에 어떤 항목들이 필요한지 확인한다.

 

 

 

확인해봤을때 result가 필요하다는 판단으로 PostRes 클래스를 만들어 준다.

 

PostRes.java

package com.graphene911.sns.model;

public class PostRes {

    private String result;



    public String getResult() {
        return result;
    }

    public void setResult(String result) {
        this.result = result;
    }
}

 

 

 

사진과 텍스트를 저장할 PostingApi를 만들어 준다.

 

 

package com.graphene911.sns.api;

import com.graphene911.sns.model.PostRes;

import okhttp3.MultipartBody;
import okhttp3.RequestBody;
import retrofit2.Call;
import retrofit2.http.Body;
import retrofit2.http.Header;
import retrofit2.http.Multipart;
import retrofit2.http.POST;
import retrofit2.http.Part;

public interface PostingApi {

    @Multipart
    @POST("/posting")
    Call<PostRes> addPosting(@Header("Authorization") String token, @Part MultipartBody.Part photo, @Part("content")RequestBody content);

}

 

 

 

처리 할 액티비티로 이동해서

 

onCreate 함수 안에 필요한 코드를 작성해준다.

 

btnSave.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                if(photoFile == null){
                    Toast.makeText(AddActivity.this, "사진은 필수 입니다.", Toast.LENGTH_SHORT).show();
                    return;
                }

                String content = editContent.getText().toString().trim();
                if(content.isEmpty()){
                    Toast.makeText(AddActivity.this, "내용을 입력하세요", Toast.LENGTH_SHORT).show();
                    return;
                }

                Retrofit retrofit = NetworkClient.getRetrofitClient(AddActivity.this);
                PostingApi api = retrofit.create(PostingApi.class);

                // 멀티파트로 파일을 보내는 경우, 파일 파라미터 만드는 방법
                RequestBody fileBody = RequestBody.create(photoFile, MediaType.parse("image/*"));
                MultipartBody.Part photo = MultipartBody.Part.createFormData("photo", photoFile.getName(), fileBody);

                // 멀티파트로 텍스트를 보내는 경우 파라미터 만드는 방법
                RequestBody contentBody = RequestBody.create(content, MediaType.parse("text/plain"));


                // Header 에 들어갈 accessToken 을 가져온다.
                SharedPreferences sp = getApplication().getSharedPreferences(Config.PREFERENCES_NAME, MODE_PRIVATE);
                String accessToken = sp.getString("accessToken", "");

                Call<PostRes> call = api.addPosting("Bearer " + accessToken, photo, contentBody);

                showProgress("포스팅 업로드 중...");

                call.enqueue(new Callback<PostRes>() {
                    @Override
                    public void onResponse(Call<PostRes> call, Response<PostRes> response) {
                        dismissProgress();

                        Toast.makeText(AddActivity.this, "업로드가 완료 되었습니다.", Toast.LENGTH_SHORT).show();
                        finish();
                    }

                    @Override
                    public void onFailure(Call<PostRes> call, Throwable t) {
                        dismissProgress();
                    }
                });


            }
        });

 

반응형