在Kotlin中使用Retrofit @PartMap错误的多部分请求(Android)

时间:2017-08-20 19:10:13

标签: android kotlin retrofit multipart android-studio-3.0

如果我在Java中使用此代码,那么它的工作正常。当我在kotlin中转换该代码时,我得到了错误。

logcat的

  

08-20 23:46:51.003 3782-3782 / com.qkangaroo.app W / System.err:java.lang.IllegalArgumentException:参数类型不能包含类型变量或通配符:java.util.Map(parameter #1)   08-20 23:46:51.003 3782-3782 / com.qkangaroo.app W / System.err:for方法ApiInterface.updateCustomerDetail   08-20 23:46:51.003 3782-3782 / com.qkangaroo.app W / System.err:at retrofit2.ServiceMethod $ Builder.methodError(ServiceMethod.java:752)   08-20 23:46:51.004 3782-3782 / com.qkangaroo.app W / System.err:at retrofit2.ServiceMethod $ Builder.methodError(ServiceMethod.java:743)   08-20 23:46:51.004 3782-3782 / com.qkangaroo.app W / System.err:at retrofit2.ServiceMethod $ Builder.parameterError(ServiceMethod.java:761)   08-20 23:46:51.004 3782-3782 / com.qkangaroo.app W / System.err:at retrofit2.ServiceMethod $ Builder.build(ServiceMethod.java:195)   08-20 23:46:51.004 3782-3782 / com.qkangaroo.app W / System.err:at retrofit2.Retrofit.loadServiceMethod(Retrofit.java:170)   08-20 23:46:51.005 3782-3782 / com.qkangaroo.app W / System.err:at retrofit2.Retrofit $ 1.invoke(Retrofit.java:147)   08-20 23:46:51.005 3782-3782 / com.qkangaroo.app W / System.err:at $ Proxy0.updateCustomerDetail(Native Method)   08-20 23:46:51.005 3782-3782 / com.qkangaroo.app W / System.err:at com.qkangaroo.app.Fragments.MoreScreen.MoreFragment.updateProfile(MoreFragment.kt:261)   08-20 23:46:51.006 3782-3782 / com.qkangaroo.app W / System.err:at com.qkangaroo.app.Fragments.MoreScreen.MoreFragment $ clickListener $ 1.onClick(MoreFragment.kt:191)   08-20 23:46:51.006 3782-3782 / com.qkangaroo.app W / System.err:在android.view.View.performClick(View.java:3517)   08-20 23:46:51.006 3782-3782 / com.qkangaroo.app W / System.err:at android.view.View $ PerformClick.run(View.java:14155)   08-20 23:46:51.006 3782-3782 / com.qkangaroo.app W / System.err:在android.os.Handler.handleCallback(Handler.java:605)   08-20 23:46:51.007 3782-3782 / com.qkangaroo.app W / System.err:在android.os.Handler.dispatchMessage(Handler.java:92)   08-20 23:46:51.007 3782-3782 / com.qkangaroo.app W / System.err:在android.os.Looper.loop(Looper.java:154)   08-20 23:46:51.007 3782-3782 / com.qkangaroo.app W / System.err:在android.app.ActivityThread.main(ActivityThread.java:4624)   08-20 23:46:51.008 3782-3782 / com.qkangaroo.app W / System.err:at java.lang.reflect.Method.invokeNative(Native Method)   08-20 23:46:51.009 3782-3782 / com.qkangaroo.app W / System.err:at java.lang.reflect.Method.invoke(Method.java:511)   08-20 23:46:51.009 3782-3782 / com.qkangaroo.app W / System.err:at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:809)   08-20 23:46:51.010 3782-3782 / com.qkangaroo.app W / System.err:at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:576)   08-20 23:46:51.011 3782-3782 / com.qkangaroo.app W / System.err:at dalvik.system.NativeStart.main(Native Method)

fragment.kt

    var map:HashMap<String,RequestBody> = HashMap<String, RequestBody>()
    map.put("version",ApiClient.createRequestBody(AppConstants.API_VERSION))
    map.put("auth_token", ApiClient.createRequestBody(customer.authToken!!))
    map.put("customer_name",ApiClient.createRequestBody(profileName))
    map.put("email", ApiClient.createRequestBody(profileEmail))

    val apiInterface = ApiClient.client.create(ApiInterface::class.java)

    val updateCustomerCall: Call<UpdateCustomer> = apiInterface.updateCustomerDetail(map)
    updateCustomerCall.enqueue(object : Callback<UpdateCustomer> {
        override fun onResponse(call: Call<UpdateCustomer>?, response: Response<UpdateCustomer>?) {

        }

        override fun onFailure(call: Call<UpdateCustomer>?, t: Throwable?) {
            utilities!!.hideProgress(progress)
        }
    })

ApiClient.kt

val MULTIPART_FORM_DATA = "multipart/form-data"

fun createRequestBody(s: String): RequestBody {
    return RequestBody.create(
            MediaType.parse(MULTIPART_FORM_DATA), s)
}

ApiInterface,.kt

@Multipart
@POST("customer")
fun updateCustomerDetail(@PartMap map: Map<String,RequestBody >): Call<UpdateCustomer>

Gradle文件

implementation "com.squareup.okhttp3:okhttp:3.8.1"
implementation "com.squareup.okhttp3:logging-interceptor:3.8.1"
implementation ("com.squareup.retrofit2:retrofit:2.3.0"){
     exclude module: 'okhttp'
}
implementation "com.squareup.retrofit2:converter-gson:2.3.0"

2 个答案:

答案 0 :(得分:21)

@JvmSuppressWildcards

之前添加RequestBody
fun updateCustomerDetail(@PartMap map: Map<String, @JvmSuppressWildcards RequestBody >): Call<UpdateCustomer>

答案 1 :(得分:0)

对我来说可行的替代方式:

  

我认为这种情况正在发生,因为Map声明是公共接口Map,而out字使值类型通用。您可以尝试改用MutableMap或HashMap。通过 tpom6oh

@Multipart
@POST("customer")
fun updateCustomerDetail(@PartMap map: HashMap<String, RequestBody>): Call<UpdateCustomer>

Retrofi Kotlin Issue