Я не могу отправить запрос на модификацию с помощью аннотации @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())
)
}
}