如何使用 Retrofit 2 从 Dropbox 下载文件

How to download files from Dropbox using Retrofit 2

我正在尝试使用 Retrofit 2 库将音频和视频文件从 Dropbox API 下载到我的 Android 应用程序中,但我收到 JSON 错误,因为我我没有正确映射响应,但由于响应显然是实际文件,我不确定如何处理它。

这是我的代码:

媒体class

data class Media(
    @Expose val id: String,
    @Expose @SerializedName("name") val title: String,
    var position: Int,
    var uri: String
)

API界面

@POST("2/files/download")
fun download(@Header("Dropbox-API-Arg") pathJson: MediaRequest): Call<Media>

我向我的客户端添加了一个拦截器,该拦截器将授权 header 添加到所有调用并且它正在工作,因为对其他端点的调用正在正确接收它们的响应。

媒体请求class

data class MediaRequest(val path: String)

这个 class,当根据请求发送时,被序列化为 JSON 正如 Dropbox API 文档所预期的那样,如下例所示:

{ "path": "id:abcd1234" }

API 来电

val request = MediaRequest(media.id)
downloadApi.download(request).enqueue(object : Callback<Media> {
    override fun onResponse(call: Call<Media>, response: Response<Media>) {
        if (response.isSuccessful) {
            // handle response
        } else {
            onError()
        }
    }

    override fun onFailure(call: Call<Media>, t: Throwable) {
        onError(t)
    }
})

我还检查了与 Postman 的完全相同的调用,调用本身没有问题,因为我收到了响应,但从我在 Postman 响应中看到的情况来看,我应该期望收到文件本身一个响应,因为当我尝试下载一个 MP3 音频文件时,响应是一个以 ID3 开头的编码字符串,这意味着它是一个 MP3 文件,如下面的屏幕截图所示:

我已经知道用我创建的 Media class 映射响应不是正确的方法,但我不知道如何正确处理该响应才能下载文件,因此我们将不胜感激。

PS:我不想使用 Dropbox SDK,因为我觉得这太过分了,因为这是我打电话给他们的唯一原因 API.

我解决问题的方法是将响应映射为 ResponseBody 对象,然后调用 response.body().byteStream() 将内容作为字节流获取,然后将它们解码为适当的文件。

来源:https://gldraphael.com/blog/downloading-a-file-using-retrofit/