LoginSignup
5
6

More than 5 years have passed since last update.

Retrofitを使って複雑なPOSTをする

Last updated at Posted at 2018-08-25

Multipartで画像と多次元配列を投げたい

Multipartで画像を投げるだけなら簡単ですが、画像と一緒に params[][hoge_id]=1&params[][hoge_name]=aaa みたいな可変長なクエリを投げるとなると方法がわからなかったので、調べた結果をメモします。

結論:OkHttpで書いてRequestBodyを渡せば良い

いきなり結論ですが、OkHttpを使ったコードを書いて作ったRequestBodyを渡すことで解決しました。コードはこんな感じです

  • Retrofitのインターフェース

    @POST("items")
    fun postItem(@Header("Authorization") token: String, @Body body: RequestBody): Single<Item>

  • APIを呼ぶ側のコード
        val boundary = System.currentTimeMillis().toString()
        val imageMedia = MediaType.parse("image/png")
        val builder = MultipartBody.Builder(boundary).apply {

            setType(MultipartBody.FORM)

            addFormDataPart("image", "image.png", RequestBody.create(imageMedia, image))

            params.forEach {
                addFormDataPart("params[][hoge_id]", it.id.toString())
                addFormDataPart("params[][hoge_name]", it.name)
            }
        }

        api.postItem(
                body = builder.build(),
                token = getToken()
        )

まとめ

そんなに頻繁に使わないのですが、よく忘れるのでメモ。
クエリでListとMapが入れ子になるような場合は、このやり方を使うのが一番楽な気がしてます。もっと良い方法があれば教えていただけると嬉しいです。

5
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
6