2016-02-19 23 views
1

我用改造2:Android。改装2 beta-4。获取错误字符串身体

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的测井响应。我看到我的日志:

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”: “验证错误”}

我已经试过这样:

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异常在这条线:

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) 

编辑:

我已经解决了它的β-4(根据https://stackoverflow.com/a/32896077/1225669):

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) { 
     // 
    } 
} 

回答

1

也许你应该使用response.errorBody()代替response.raw()。身体()。 以下是更新2 erro处理Retrofit 2.0 how to get deserialised error response.body的更详细的解释。

+0

谢谢。 http://stackoverflow.com/a/32896077/1225669。我已经修改了beta-3到beta-4的示例。请参阅我修改的问题。 – anivaler

1

试试这个

response.errorBody();

response.message();