【问题标题】:How Do I Send My Multipart Form Data POST Request In Kotlin Using Retrofit and OkHttp?如何使用 Retrofit 和 OkHttp 在 Kotlin 中发送我的多部分表单数据 POST 请求?
【发布时间】:2022-01-06 06:21:07
【问题描述】:

我正在尝试将多部分表单数据发送到服务器:https://example.com/mail/

数据是一个pdf文件和一个json对象。我必须尽我所能遵循各种示例,但没有任何运气。它从我的 Activity 的 onCreate 调用到 uploadToServer(context) 开始,最终在 enqueue 中崩溃。

class APIClient {
private var retrofit: Retrofit? = null

fun getClient(): Retrofit? {
    val interceptor = HttpLoggingInterceptor()
    interceptor.level = HttpLoggingInterceptor.Level.BODY
    val client = OkHttpClient.Builder().addInterceptor(interceptor).build()
    retrofit = Retrofit.Builder()
        .baseUrl("https://example.com/mail/")
        //.addConverterFactory(GsonConverterFactory.create())
        .client(client)
        .build()
    return retrofit
}

interface UploadAPIs {
    @Multipart
    @POST("https://example.com/mail/")
    fun uploadImage(
        @Part("report") file: MultipartBody.Part,
        @Part("json") requestBody: RequestBody
    ): Call<String>
}

fun makeGSONRequestBody(jsonObject: Any): RequestBody {
    return Gson().toJson(jsonObject).toRequestBody("multipart/form-data".toMediaTypeOrNull())

fun uploadToServer(context: Context) {
    //Create a file object using file path
    var file = File(context.getExternalFilesDir(null), "/Hello.pdf")

    var details: MutableMap<String, String> = mutableMapOf()
    details["clockinTime"] = "2100"
    details["location"] = "Smith St"
    details["companyEmail"] = "example@gmail.com"
    Log.d("TRACE", "Check the JSON string" + Gson().toJson(details))

    var reqBod = makeGSONRequestBody(details)
    val inputStream = context.contentResolver.openInputStream(Uri.fromFile(file))
    val requestFile =
    inputStream!!.readBytes().toRequestBody("multipart/form-data".toMediaType())
    var fileBody =  MultipartBody.Part.createFormData("image", file.name, requestFile)
    val apiInterface = APIClient().getClient()?.create<UploadAPIs>(UploadAPIs::class.java)

    val call: Call<String> = apiInterface!!.uploadImage(fileBody, reqBod)
    call.enqueue(object : Callback<String> {
        override fun onResponse(call: Call<String>, response: Response<String>) {
            Log.d("TRACE", "response is$response")
        }

        override fun onFailure(call: Call<String>, t: Throwable) {
            Log.d("TRACE", "didn't work$t")
        }
})

任何帮助将不胜感激。

编辑 我将 requestFile 变量更改为 mime 类型“image/*”。现在我收到错误:

2022-01-06 00:37:08.449 540-587/system_process D/ArtManagerInternalImpl: /data/misc/iorapd/com.reportsapp/1/com.reportsapp.MainActivity/compiled_traces/compiled_trace.pb doesn't exist

【问题讨论】:

    标签: android kotlin retrofit okhttp


    【解决方案1】:

    可能是你的媒体类型不对,你可以试试。你可以贴出错误信息

    val requestFile = RequestBody.create(MediaType.parse("image/*"), file)
    

    只过滤你处理的错误,如果发生崩溃,会有如下日志:

    【讨论】:

    • 完成,先生。现在我得到: 2022-01-06 00:37:08.449 540-587/system_process D/ArtManagerInternalImpl: /data/misc/iorapd/com.reportsapp/1/com.reportsapp.MainActivity/compiled_traces/compiled_trace.pb 没有t 存在 2022-01-06 00:41:50.348 540-587/system_process D/ArtManagerInternalImpl: /data/misc/iorapd/com.reportsapp/1/com.reportsapp.MainActivity/compiled_traces/compiled_trace.pb 不存在
    • 只过滤自己的进程会不会出错?
    • 我不太清楚你指的是什么。
    • 这是我现在遇到的错误:2022-01-06 01:01:45.773 540-587/system_process D/ArtManagerInternalImpl:/data/misc/iorapd/com.reportsapp/1/ com.reportsapp.MainActivity/compiled_traces/compiled_trace.pb 不存在
    • RequestBody.create 已弃用
    猜你喜欢
    • 2022-12-05
    • 1970-01-01
    • 1970-01-01
    • 2015-06-23
    • 2023-03-11
    • 2022-12-04
    • 1970-01-01
    • 1970-01-01
    • 2020-08-29
    相关资源
    最近更新 更多