无法使用Moshi在Retrofit中为类创建@Body转换器

时间:2019-11-17 12:35:43

标签: android kotlin retrofit moshi

我在MoshiConverterFactory和Retrofit上遇到问题-我无法将POST JSON请求发送到RestAPI,因为它始终会导致错误。我可以使用Multipart成功完成此操作,但是API不支持它,因此这是不可能的...

我的单例对象包含对服务的引用:

Offer.rsOffersAll();
      ^

TypeError: Offer.rsOffersAll is not a function

注册导致我的ViewModel问题的用户方法:

object Singleton {
    val okhttp = OkHttpClient.Builder()
        .addInterceptor(HttpLoggingInterceptor().apply {
            level = HttpLoggingInterceptor.Level.BODY
        })
        .build()

    val moshi = Moshi.Builder().build()

    val retrofit = Retrofit.Builder()
        .baseUrl("https://some_shows_api.com/api/")
        .client(okhttp)
        .addConverterFactory(MoshiConverterFactory.create())
        .build()

    val service = retrofit.create(ShowsApiService::class.java)
}

我的界面:

    fun registerUser(email: String, password: String) {
        val authData = AuthData(email, password)
        Singleton.service.register(authData).enqueue(object : Callback<Register> {
            override fun onFailure(call: Call<Register>, t: Throwable) {
                // some errror implementation
            }

            override fun onResponse(call: Call<Register>, response: Response<Register>) {
                if (response.isSuccessful) {
                    val body = response.body()
                    if (body != null) {
                        // login user
                    } else {
                        // some error implementation
                    }
                }
            }
        })
    }

我已经尝试做的事情:在AuthData类的参数上添加data class AuthData( val email: String, val password: String ) interface ShowsApiService { @Headers("Content-Type: application/json") @POST("users") fun register(@Body authData: AuthData): Call<Register> } 批注(错误仍然相同),以多部分和表单URL编码方式传递数据(API不支持它) 。有人看到我在做什么错吗?我也没有看到一些使用Moshi与Retrofit结合使用的在线示例...非常感谢您的帮助或提示。谢谢!

错误:

@field:Json()

1 个答案:

答案 0 :(得分:1)

我也从未使用过Moshi。但是您可以尝试使用此方法。

@POST("users")
fun register(@Body authData: Map<String, String>): Call<Register>

并如下创建地图:

fun registerUser(email: String, password: String) {
    val authData = HashMap<String, String>()
    authData.put("email", email)
    authData.put("password", password)

    Singleton.service.register(authData).

    ...
}