首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Kotlin (Android)中的Multipart request with Retrofit @PartMap错误

Kotlin (Android)中的Multipart request with Retrofit @PartMap错误
EN

Stack Overflow用户
提问于 2017-08-21 03:10:13
回答 3查看 7.9K关注 0票数 20

如果我在Java中使用这段代码,那么它工作得很好。当我在kotlin中转换代码时,我得到了错误。

Logcat

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

fragment.kt

代码语言:javascript
运行
复制
    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

代码语言:javascript
运行
复制
val MULTIPART_FORM_DATA = "multipart/form-data"

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

ApiInterface,.kt

代码语言:javascript
运行
复制
@Multipart
@POST("customer")
fun updateCustomerDetail(@PartMap map: Map<String,RequestBody >): Call<UpdateCustomer>

Gradle文件

代码语言:javascript
运行
复制
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"
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-08-22 13:25:33

RequestBody之前添加@JvmSuppressWildcards

代码语言:javascript
运行
复制
fun updateCustomerDetail(@PartMap map: Map<String, @JvmSuppressWildcards RequestBody >): Call<UpdateCustomer>
票数 57
EN

Stack Overflow用户

发布于 2019-07-12 16:35:19

使用HashMapMutableMap,而不是Map< K,out V> for PartMap

另一种方法对我来说很好。由Retrofi Kotlin Issue中的alex-tpom6oh提到

我认为这是因为映射声明是公共接口Map< K,out V>,out word使值类型泛型。您可以尝试使用MutableMapHashMap

代码语言:javascript
运行
复制
@Multipart
@POST("customer")
fun updateCustomerDetail(@PartMap map: HashMap<String, RequestBody>): Call<UpdateCustomer>
票数 16
EN

Stack Overflow用户

发布于 2022-02-03 05:33:37

您可以使用JsonObject进行转换,如下所示:

  1. 在您的ApiService类

代码语言:javascript
运行
复制
@Headers("Content-Type: application/json")
@POST(EndPoints)
fun apiName(
    @Body body: JsonObject
): Call<ResponseBody>

  1. ,并在主类

中像这样传递

代码语言:javascript
运行
复制
JsonObject body = new JsonObject();
body.addProperty("key", "value");
body.addProperty("key", "value");

ApiInterface apiInterface = APIClient.getClient().create(ApiService.class);
Call<ResponseBody> call = apiInterface.follow(body);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45785874

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档