如果我写:
String str = response.errorBody().string();
String errors = Misc.get_errors(str);
一切正常(get_errors
是final static
方法,只重新格式化str
)。
但是,如果我直接写:
String errors = Misc.get_errors(response.errorBody().string());
失败了。
我的Java有点生疏,我想知道为什么结果不同。
编辑:
public final static String get_errors(String errors) {
StringBuilder sb = new StringBuilder();
try {
JSONObject jObjError = new JSONObject(errors);
Iterator<String> it = jObjError.keys();
while (it.hasNext()) {
sb.append(jObjError.get(it.next()).toString().replace("[\"", "").replace("\"]", ""));
sb.append(System.getProperty("line.separator"));
}
} catch (Exception e) {
e.printStackTrace();
}
return sb.toString();
Callback<Joueur> callback = new Callback<Joueur>(){
@Override
public void onResponse(Call<Joueur> call, Response<Joueur> response){
// display message if http error(s)
if(!response.isSuccessful()){
try{
String raw_errors = response.errorBody().string();
String errors = Misc.get_errors(raw_errors);
Toast display = Toast.makeText(getApplicationContext(), errors, Toast.LENGTH_LONG);
display.show();
}
catch(Exception e){
e.printStackTrace();
}
}
// otherwise, launch new intent
else{
Intent myIntent = new Intent(Inscription_activity.this, Connexion_activity.class);
Inscription_activity.this.startActivity(myIntent);
}
}
答案 0 :(得分:1)
在使用错误主体(因为它是一个ResponseBody)之后,它将变为空(因为它是一个缓冲区并被消耗)。这就是为什么它只是第一次有效。
如果要复制要使用的响应,可以执行此操作。
val oldResponseBody = it.response().errorBody()
val responseBytes = oldResponseBody.bytes()
val reponseCopy1 = ResponseBody.create(oldResponseBody.contentType(), responseBytes)
val reponseCopy2 = ResponseBody.create(oldResponseBody.contentType(), responseBytes)
请注意,此方法会立即将响应的所有字节复制到内存中。
答案 1 :(得分:0)
获取错误正文的只读副本(在 OkHttp3 版本 4.9.1
上测试):
response()?.errorBody()?.source()?.buffer?.snapshot()?.utf8()