Kotlin Retrofit Moshi POST 请求不工作

Kotlin Retrofit Moshi POST request not working

我正在开发一个与 API 到 select 接口并更新 MySQL 数据库的应用程序。

我将 Kotlin 与 Retrofit 和 Moshi 转换器结合使用。 (因为我刚开始学习所有这些东西,所以这个应用程序是根据 https://developer.android.com/courses/pathways/android-basics-kotlin-unit-4-pathway-2 上的火星照片代码修改的。)

得益于上述教程的构建,我已经在 Retrofit 中成功实现了 GET 部分,但是我有一段时间 POST 访问数据库。

通过 API 更新的 POST 在 Postman 中有效,但我尝试了多种方法在我的应用程序中复制它但没有成功。我已经尝试了一个非常基本的 POST 传递我的数据对象(作为标准的 Kotlin vars 以及 Json 注释或 SerializedName 注释),并且我尝试了 Formurlencoded with Fields 和 Multipart with Parts.

我希望包括所有相关代码(至少是最近的尝试)。感谢您的帮助!

*** My Data Class (have also tried it without the Json annoations) ***

import com.squareup.moshi.Json

data class IsVotes(
    @Json(name = "is_votes") var isVotes: String,
    @Json(name = "is_id") var isId: String
        )

------

*** The function in the ViewModel file - called by a Databinded button click and using static vars for testing

   fun updateIsVotes(){
        viewModelScope.launch {
            // TODO: Response success var?
            try {
                IsApi.retrofitService.updateVotesAsync( IsVotes("99","5"))
                _putStatus.value = IsPutStatus.SUCCESS
            }
            catch (e:Exception) {
               _putStatus.value = IsPutStatus.ALMOST

            }
        }
    }

--------

*** The api service file and call ****

package com.viscidcreates.iswhatapi.network

import com.squareup.moshi.Moshi
import com.squareup.moshi.kotlin.reflect.KotlinJsonAdapterFactory
import kotlinx.coroutines.Deferred
import retrofit2.Response
import retrofit2.Retrofit
import retrofit2.converter.moshi.MoshiConverterFactory
import retrofit2.http.*


private const val BASE_URL = "https://beamcreates.com/is_things_api/v1/"
const val getThings = "Api.php?apicall=getthings"
const val updateVotes = "Api.php?apicall=updatevotes"


private val moshi = Moshi.Builder()
    .add(KotlinJsonAdapterFactory())
    .build()

private val retrofit = Retrofit.Builder()
    .addConverterFactory(MoshiConverterFactory.create(moshi))
    .baseUrl(BASE_URL)
    .build()

interface IsApiService {
    @GET(getthings)
    suspend fun getThings(): List<IsThing>
    
    @POST(updateVotes)
    suspend fun updateVotesAsync(@Body votes: IsVotes):  Deferred<Response<Void>>

}

object IsApi {
    val retrofitService: IsApiService by lazy {
        retrofit.create(IsApiService::class.java)
    }
}

通常您将 @Body 类 创建为 :

@JsonClass(generateAdapter = true)
data class IsVotes(
   @Json(name = "is_votes")
   val isVotes: String,
   @Json(name = "is_id")
   val isId: String
) 

要添加您需要在 build.gradle

中添加的 MoshiGenerator
kapt "com.squareup.moshi:moshi-kotlin-codegen:1.13.0"

但如果是 minify/obfuscation 的问题,你应该首先尝试并更改 @Json(name="is_votes")@field:Json(name="is_votes")is_id.

相同