首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >安卓。改装2β-4。获取错误字符串体

安卓。改装2β-4。获取错误字符串体
EN

Stack Overflow用户
提问于 2016-02-19 08:16:33
回答 2查看 5.2K关注 0票数 1

我用Retrofit 2:

代码语言:javascript
复制
compile 'com.squareup.retrofit2:retrofit:2.0.0-beta4'
compile 'com.squareup.retrofit2:converter-gson:2.0.0-beta4'
compile 'com.squareup.okhttp3:logging-interceptor:3.0.0-RC1'

我为记录响应添加了okhttp3.logging.HttpLoggingInterceptor。我看到了我的日志:

代码语言:javascript
复制
D/OkHttp: <-- 400 Bad Request http://myurl.com/api/ (616ms)
D/OkHttp: Date: Fri, 19 Feb 2016 07:59:50 GMT
D/OkHttp: Server: Apache/2.4.12
D/OkHttp: X-Powered-By: PHP/5.4.45
D/OkHttp: Vary: Accept-Encoding
D/OkHttp: Connection: close
D/OkHttp: Content-Type: application/json; charset=UTF-8
D/OkHttp: OkHttp-Sent-Millis: 1455868788858
D/OkHttp: OkHttp-Received-Millis: 1455868789211
D/OkHttp: {"error_message":"Validation error"}
D/OkHttp: <-- END HTTP (87-byte body)

如何从响应中获得错误正文字符串?在我的示例中,它是json {“error_message”:“验证错误”}

我试过这样做:

代码语言:javascript
复制
import retrofit2.Response;

Reader charStream = response.raw().body().charStream();
BufferedReader in = new BufferedReader(charStream);
String line = null;
StringBuilder sb = new StringBuilder();
while ((line = in.readLine()) != null) {
    sb.append(line);
}

但我在这条线上找到了IllegalStateException:

代码语言:javascript
复制
Reader charStream = response.raw().body().charStream();

FATAL EXCEPTION: main
java.lang.IllegalStateException: Cannot read raw response body of a converted body.
retrofit2.OkHttpCall$NoContentResponseBody.source(OkHttpCall.java:257)
at okhttp3.ResponseBody.byteStream(ResponseBody.java:69)
at okhttp3.ResponseBody.charStream(ResponseBody.java:100)
at com.myapp.delegate.retrofit.ApiDelegateRetrofit.parseError(ApiDelegateRetrofit.java:146)

编辑:

我已经解决了beta-4的问题(根据https://stackoverflow.com/a/32896077/1225669的说法):

代码语言:javascript
复制
if (response != null && response.errorBody() != null) {
    Converter<ResponseBody, ErrorData> errorConverter = retrofit.responseBodyConverter(ErrorData.class, new Annotation[0]);
    try {
        ErrorData error = errorConverter.convert(response.errorBody());
        return error;
    } catch (IOException e) {
        //
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-02-19 08:34:39

也许您应该使用response.errorBody()而不是response.raw().body()。这里更详细地解释了Retrofit2Erro处理Retrofit 2.0 how to get deserialised error response.body

票数 2
EN

Stack Overflow用户

发布于 2016-02-19 08:34:21

尝尝这个

response.errorBody();

response.message();

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35500456

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档