retrofit提交文件时附带参数错误

2019-11-26  本文已影响0人  _蘇芳_

如下图所示,uploadFile是文件,relationId、type这种是提交时附带的参数

    @Multipart
    @POST("api/common/upload/user/pic")
    suspend fun uploadAvatar(
        @Part("relationId") relationId :String,
        @Part("type") type :String,
        @Part uploadFile :MultipartBody.Part //此处part不能设置value,提交名称在下面设置
    ):Response<BaseDTO<*>>

如果retrofit添加了.addConverterFactory(GsonConverterFactory.create()),提交时会当做json提交,如果直接在接口中定义@Part("relationId") relationId :String,contentType会是application-json,提交的字符串会多拼上一堆双引号

将接口修改为:

    @Multipart
    @POST("api/common/upload/user/pic")
    suspend fun uploadAvatar(
        @Part("relationId") relationId :RequestBody,
        @Part("type") type :RequestBody,
        @Part uploadFile :MultipartBody.Part
    ):Response<BaseDTO<*>>

参数用下面方式生成即可:

    // 文件
    fun fileToMultiPart(file: File,name:String=uploadFile):MultipartBody.Part {
        val requestBody = RequestBody.create(MultipartBody.FORM, file)
        val part = MultipartBody.Part.createFormData(name, file.name, requestBody) //提交名称在这设置
        return part
    }
    // 图片
    fun getImgRequestBody(file:File) = RequestBody.create(MediaType.parse("image/*"),  file)
    // 字符串,上面的接口中 type和relationId用这个生成requestBody
    fun getTextRequestBody(txt:String) = RequestBody.create(MediaType.parse("text/plain"),  txt)

    /*----------- 下面都是生成json的requestBody---------------------*/
    fun getRequestBody(params: Map<String, Any>): RequestBody {
        return RequestBody.create(MediaType.parse("application/json; charset=utf-8"), JSONObject(params).toString())
    }

    fun getRequestBody(jsonObject: JSONObject): RequestBody {
        return RequestBody.create(MediaType.parse("application/json; charset=utf-8"), jsonObject.toString())
    }

    fun getRequestBody(json: String): RequestBody {
        return RequestBody.create(MediaType.parse("application/json; charset=utf-8"), json)
    }

    fun getRequestBody(`object`: Any): RequestBody {
        val json = Gson().toJson(`object`)
        return RequestBody.create(MediaType.parse("application/json; charset=utf-8"), json)
上一篇下一篇

猜你喜欢

热点阅读