【发布时间】:2019-11-20 07:53:59
【问题描述】:
我看到像How to download file in Android using Retrofit library? 这样的主题,他们使用@Streaming 和RxJava / 回调。
我有 Kotlin、协程、Retrofit 2.6.0 和类似https://stackoverflow.com/a/56473934/2914140 的查询:
@FormUrlEncoded
@Streaming
@POST("export-pdf/")
suspend fun exportPdf(
@Field("token") token: String
): ExportResponse
我有一个改造客户:
retrofit = Retrofit.Builder()
.baseUrl(SERVER_URL)
.client(okHttpClient)
.build()
service = retrofit.create(Api::class.java)
如果某个token参数正确,则查询返回PDF文件:
%PDF-1.4
%����
...
如果错误,会返回带有错误描述的JSON:
{
"success": 0,
"errors": {
"message": "..."
}
}
所以,ExportResponse 是一个包含 JSON 字段 POJO 的数据类。
我无法访问文件数据
Response response = restAdapter.apiRequest();
try {
//you can now get your file in the InputStream
InputStream is = response.getBody().in();
} catch (IOException e) {
e.printStackTrace();
}
因为 ExportResponse 是一个数据类,所以val response: ExportResponse = interactor.exportPdf(token) 会返回数据,而不是 Retrofit 对象。
【问题讨论】:
-
您可以将
exportPdf的返回类型更改为Response<Any>,然后查看响应码。如果没问题,则将正文作为流读取。如果不是,请尝试反序列化ExportResponse。 -
@AndreiTanana,非常感谢!我明天检查。如果是对的,会请你在这里回答。
-
@AndreiTanana,请在此处添加您的答案,以便我接受。稍后我会添加我的答案。我改了一下:
Response<String>和.addConverterFactory(ScalarsConverterFactory.create()),之后就可以拿到文件了。 -
好的,我想我找到了更好的解决方案
标签: android kotlin retrofit2 kotlin-coroutines