【问题标题】:Controlling the response body in retrofit在改造中控制响应体
【发布时间】:2018-02-12 18:20:28
【问题描述】:

我有一个非常简单的 web 服务,它由一个 post 端点组成:

  @POST(PROTOCOL)
  Call<POST> addMaintenanceProtocol(@Body MaintenanceProtocolItem proto);

当我调用它时,我会调用 onFailure 方法,但出现以下异常:

02-12 19:57:04.214 5069-5069/com.example.nborisov.perfectelectra W/System.err: com.google.gson.stream.MalformedJsonException: Use JsonReader.setLenient(true) to accept malformed JSON at line 1 column 1 path $
02-12 19:57:04.214 5069-5069/com.example.nborisov.perfectelectra W/System.err:     at com.google.gson.stream.JsonReader.syntaxError(JsonReader.java:1559)
02-12 19:57:04.214 5069-5069/com.example.nborisov.perfectelectra W/System.err:     at com.google.gson.stream.JsonReader.checkLenient(JsonReader.java:1401)
02-12 19:57:04.214 5069-5069/com.example.nborisov.perfectelectra W/System.err:     at com.google.gson.stream.JsonReader.doPeek(JsonReader.java:593)
02-12 19:57:04.214 5069-5069/com.example.nborisov.perfectelectra W/System.err:     at com.google.gson.stream.JsonReader.peek(JsonReader.java:425)
02-12 19:57:04.214 5069-5069/com.example.nborisov.perfectelectra W/System.err:     at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:205)
02-12 19:57:04.214 5069-5069/com.example.nborisov.perfectelectra W/System.err:     at retrofit2.converter.gson.GsonResponseBodyConverter.convert(GsonResponseBodyConverter.java:37)
02-12 19:57:04.214 5069-5069/com.example.nborisov.perfectelectra W/System.err:     at retrofit2.converter.gson.GsonResponseBodyConverter.convert(GsonResponseBodyConverter.java:25)
02-12 19:57:04.214 5069-5069/com.example.nborisov.perfectelectra W/System.err:     at retrofit2.ServiceMethod.toResponse(ServiceMethod.java:119)
02-12 19:57:04.214 5069-5069/com.example.nborisov.perfectelectra W/System.err:     at retrofit2.OkHttpCall.parseResponse(OkHttpCall.java:218)
02-12 19:57:04.214 5069-5069/com.example.nborisov.perfectelectra W/System.err:     at retrofit2.OkHttpCall$1.onResponse(OkHttpCall.java:112)
02-12 19:57:04.214 5069-5069/com.example.nborisov.perfectelectra W/System.err:     at okhttp3.RealCall$AsyncCall.execute(RealCall.java:141)
02-12 19:57:04.214 5069-5069/com.example.nborisov.perfectelectra W/System.err:     at okhttp3.internal.NamedRunnable.run(NamedRunnable.java:32)
02-12 19:57:04.215 5069-5069/com.example.nborisov.perfectelectra W/System.err:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
02-12 19:57:04.215 5069-5069/com.example.nborisov.perfectelectra W/System.err:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
02-12 19:57:04.215 5069-5069/com.example.nborisov.perfectelectra W/System.err:     at java.lang.Thread.run(Thread.java:764)

这是由于此端点的返回正文是 pdf 文件而不是 GSON,或者更一般地说是原始字节流。我怎样才能使改造不尝试将响应体反序列化为 gson 对象。在服务器上,我可以看到实际的 POST 请求已经成功,只是客户端很难解析数据。

【问题讨论】:

    标签: android retrofit2


    【解决方案1】:

    使用retrofit2下载文件...使用@Streaming注解..并使其调用ResponseBody对象而不是Post..

    @POST(PROTOCOL) @Streaming Call<ResponseBody> addMaintenanceProtocol(@Body MaintenanceProtocolItem proto);

    【讨论】:

    • 会试试这个,但我也修改了我的服务器不返回 PDF 而只是一个普通的 http 响应代码,现在我得到的异常是 java.io.EOFException: End of input at第 1 行第 1 列路径 $.除了处理这种“预期的”异常之外,我还可以做些什么来“沉默”响应。 IE。只关心返回http状态码,不关心别的?
    • 在发送了一个普通的 http 响应之后……onFailure() 仍然被调用 ??
    猜你喜欢
    • 2018-11-04
    • 2016-06-30
    • 2016-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-15
    • 2020-09-12
    相关资源
    最近更新 更多