Retroffit2의 MultipartPOST

6470 단어 Retrofit2Android
금방 잊어버리기 때문에 필기를 합니다.
잘못이 있으면 꼭 지적해 주세요.

하고 싶은 일


표제와 같다.
API에 이미지 같은 거 넣고 싶어요.

컨디션

  • AndroidStudio 2.3.2
  • buildToolVersion 25.0.2
  • Retrofit2 2.2.0
  • Okhttp 3.8.0
  • Retrolambda 3.3.0
  • RxJava2 2.0.8
  • RxAndroid 2.0.1
  • 메서드


    1. 인터페이스 정의

    @Body 모방RequestBoby이 추가된 인터페이스를 정의하는 매개 변수에 포함됩니다.
    다음은 /post에 던진 예다.
    api.java
    @POST("/post")
    Single<Response<StatusResponse>> createPost(@Body RequestBody images);
    
    필요한 줄 알았는데@Multipart 필요 없어요.

    2. RequestBody의 생성

    Okhttp3.RequestBody에 존재하는 Builder를 사용하여 생성합니다.
    PostService.java
    MultipartBody.Builder builder = new MultipartBody.Builder()
      .setType(MultipartBody.FORM)
      .addFormDataPart("caption", intent.getStringExtra("caption"));
    
    for (File file : files) {
      builder.addFormDataPart("media", file.getName(), 
      // RequestBody.createが廃止されたので、file.toRequestBodyに修正
      file.toRequestBody("image/jpg".toMediaTypeOrNull(), 0, file.size)
    }
    
    RequestBody body = builder.build();
    
    2010/09/30
    RequestBody.create가 폐지되었기 때문에 파일입니다.toRequestBody로 수정되었습니다.
    수정안을 받았습니다@mizukicker선생님, 감사합니다
    -- 추기는 여기까지--

    setType


    Content-Type을 지정합니다.Content-Type은 다음과 같습니다.
  • multipart/form-data
  • application/octet-stream
  • text/plain
  • image/jpeg
  • RequestBody에 다음 Type이 정의되어 있습니다.

    Content-Type
    FORM
    multipart/form-data
    MIXED
    multipart/mixed
    ALTERNATIVE
    multipart/alternative
    DIGEST
    multipart/digest
    PARALLEL
    multipart/parallel
    내부는 각 값에 대응하는 문자열을 MediaType.parse()에 전달합니다.
    이번에 상술한 것을 사용했다FORM.

    addFormDataPart


    name과value를 매개 변수로 하는 것도 있고,name,fileName,body를 매개 변수로 하는 것도 있습니다.
    문자열만 있는 경우(name, value).
    이미지 또는 파일인 경우(name, fileName, value).
    세 번째 매개변수에는 RequestBody가 필요합니다.RequestBody.create()등으로 하면 됩니다.

    3. 호출 실행


    ViewModel 및 Repository 등에서 실제로 호출됩니다.
    HogeRepository.java
    //Maybe<T>を返す
    return ApiClient.postApi.createPost(body)
      .compose(DebugTransformer.withSingle("createNewPost"))
      .doOnError(throwable -> {
        Log.d("debug", "error: createNewPost");
        throwable.printStackTrace();
      })
      .filter(response -> response.body() != null)
      .map(response -> response.body().status);
    
    Repository의 구현 사례는 다음과 같습니다.
    실제로 ViewModel 등을 통해 subscribe를 미리 진행하고 API 호출 결과를 사용하여 View를 반영합니다.

    좋은 웹페이지 즐겨찾기