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
.
相同
我正在开发一个与 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
kapt "com.squareup.moshi:moshi-kotlin-codegen:1.13.0"
但如果是 minify/obfuscation 的问题,你应该首先尝试并更改
@Json(name="is_votes")
到 @field:Json(name="is_votes")
和 is_id
.