diadia

興味があることをやってみる。自分のメモを残しておきます。

retrofit multipart送信を行う

コンテンツ

  1. Multipart通信における知見
  2. 関連記事
  3. 参考

Multipart通信における知見

実装概要

実装ではInterfaceの設定とretrofitでinterfaceメソッド実行を行う。

Interfaceについて

    //Itemオブジェクトを生成する
    //認証ユーザーのみリクエスト送れる仕組みが必要
    //@Headers("Content-Type:application/json")
    @Multipart
    @POST("api/item_create_1/")
    fun postItemCreateAPIViewMultiPart(
        @Header("Authorization") authTokenHeader: String, 
        @Part file:MultipartBody.Part,
        @Part("testpart") requestBody: RequestBody
    ):Call<ResultModel>

@Partには2つの使い方がある。 Partに付随するのはMultipartBody.Partであるか、RequestBodyであるかである。

テキストデータを送信する場合には、 RequestBodyオブジェクトを使う。 画像を送信する場合には、画像ファイルをラッピングしたMultipartBody.Partを使う。

RequestBodyオブジェクトを生成する

val reqBody :RequestBody = RequestBody.create(MediaType.parse("application/json"), itemObj.toString())
RequestBodyクラスについて

RequestBody (OkHttp 3.14.0 API)

RequestBodyクラスはOkHttp3のクラスである。

returns method
static RequestBody create(MediaType contentType, String content)
static RequestBody create(MediaType contentType, File file)

RequestBodyにはstaticメソッドのcreateがある。 このメソッドの第1引数は MediaType オブジェクトである。 第2引数はいろいろ種類がある。 自分が使うものとして、FileオブジェクトとStirngオブジェクトがある。画像を送信したい場合には画像のFileオブジェクトを渡す。テキストデータの場合はStringオブジェクトを渡す。

このインスタンスは、テキストデータならこのまま送れるし、画像データならこれを核にしてMultipartBody.Partオブジェクトを生成する。

var strContent = "{ 'item' : {'id':3, 'title':'医学書', 'author':'ドクター'} }"
val mediaType = MediaType.parse("application/json")
val reqBody = RequestBody.create(mediaType, strContent)

MultipartBody.Partオブジェクトを生成する方法

MultipartBodyクラスはRequestBodyクラスのサブクラスである。

retruns method
static MultipartBody.Part createFormData(String name, String filename, RequestBody body)

画像を送信するためにMultipartBody.PartのcreateFormData()メソッドを使う。

val filepath = "hoge"
val imageFile = File(filePath)

val mediaType = MediaType.parse("image/*")
val reqBody = RequestBody.create(mediaType, imageFile)
val part = MultipartBody.Part.createFormData("part_name", imageFile.name, reqBody)

memo

上記のインターフェースとオブジェクトを組み合わせてmultipart通信を実行する。

疑問点

関連記事

Retrofitまとめ - diadia

参考

Android Image Upload Example | Multipart Retrofit2

retrofitでマルチパートなものをPOSTする - tumblr

Upload file in Android Java with retrofit 2 - Vo Thanh Tung - Medium

Android Image Upload Example | Multipart Retrofit2