Запрос на модификацию @Multipart не выполняется - PullRequest
0 голосов
/ 05 марта 2020

Я не могу отправить запрос на модификацию с помощью аннотации @Multipart в kotlin. Но по тому же пути, когда я отправляю какой-либо запрос с @FormUrlEncoded без @Multipart, используя строковое значение, он работал нормально. Я не могу понять, почему это происходит. Вот мой файл Api.kt:

interface Api {
    @Multipart
    @POST("user_profile")
    suspend fun profileImageUpload(
        @HeaderMap headers: HashMap<String, String>,
        @Part avatar : MultipartBody.Part
    ) : Response<String>

    companion object {
        operator fun invoke(
            networkConnectionInterceptor: NetworkConnectionInterceptor
        ): Api {
            val okHttpClient = OkHttpClient.Builder()
                .addInterceptor(networkConnectionInterceptor)
                .build()

            return Retrofit.Builder()
                .baseUrl(BuildConfig.BASE_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .client(okHttpClient)
                .build()
                .create(Api::class.java)

        }

        val headers = hashMapOf(
            "authorization" to "Bearer " + App.userDetails.token
        )
    }

}

Я вызываю этот метод API здесь, в моем репозитории:

class UserRepository(
    private val api: Api
) : SafeApiRequest() {
    suspend fun updateProfileAvatar(multipartData: MultipartBody.Part) = apiRequest { api.profileImageUpload(Api.headers, multipartData) }
}

Вот метод, который я вызываю этот метод репозитория:

    fun onProfileImageUpload(uri: Uri) {
        Coroutines.main{
            try {
                val imageResponse = repository.updateProfileAvatar(
                    getImageForUpload(uri, "avatar")
                )
            } catch(e : Exception) {}
        }
    }

Здесь getImageForUpload метод обеспечивает MultipartBody.Part:

    fun getImageForUpload(uri: Uri, multipartDataName: String): MultipartBody.Part {
        val image = File(uri.toString())

        image.also{
            return MultipartBody.Part.createFormData(
                multipartDataName,
                image.name,
                image.asRequestBody("image/*".toMediaType())
            )
        }
    }
...