OkHttp - 获取失败的响应正文
OkHttp - Get failed response body
我目前正在开发的应用程序的 API 使用 JSON 作为通信数据的主要方式 - 包括失败响应场景中的错误消息(响应代码!= 2xx)。
我正在迁移我的项目以使用 Square 的 OkHttp 网络库。但是我很难解析所述错误消息。对于 OkHttp 的 response.body().string()
,显然,只有 returns 请求代码 "explanation"(Bad Request
、Forbidden
等)而不是 "real" 正文内容(在我的情况:描述错误的 JSON。
如何获取真正的响应体呢?这在使用 OkHttp 时甚至可能吗?
作为示例,这是我解析 JSON 响应的方法:
private JSONObject parseResponseOrThrow(Response response) throws IOException, ApiException {
try {
// In error scenarios, this would just be "Bad Request"
// rather than an actual JSON.
String string = response.body().toString();
JSONObject jsonObject = new JSONObject(response.body().toString());
// If the response JSON has "error" in it, then this is an error message..
if (jsonObject.has("error")) {
String errorMessage = jsonObject.get("error_description").toString();
throw new ApiException(errorMessage);
// Else, this is a valid response object. Return it.
} else {
return jsonObject;
}
} catch (JSONException e) {
throw new IOException("Error parsing JSON from response.");
}
}
我觉得很蠢。我现在知道为什么上面的代码不起作用了:
// These..
String string = response.body().toString();
JSONObject jsonObject = new JSONObject(response.body().toString());
// Should've been these..
String string = response.body().string();
JSONObject jsonObject = new JSONObject(response.body().string());
TL;DR 应该是 string()
而 不是 toString()
.
我目前正在开发的应用程序的 API 使用 JSON 作为通信数据的主要方式 - 包括失败响应场景中的错误消息(响应代码!= 2xx)。
我正在迁移我的项目以使用 Square 的 OkHttp 网络库。但是我很难解析所述错误消息。对于 OkHttp 的 response.body().string()
,显然,只有 returns 请求代码 "explanation"(Bad Request
、Forbidden
等)而不是 "real" 正文内容(在我的情况:描述错误的 JSON。
如何获取真正的响应体呢?这在使用 OkHttp 时甚至可能吗?
作为示例,这是我解析 JSON 响应的方法:
private JSONObject parseResponseOrThrow(Response response) throws IOException, ApiException {
try {
// In error scenarios, this would just be "Bad Request"
// rather than an actual JSON.
String string = response.body().toString();
JSONObject jsonObject = new JSONObject(response.body().toString());
// If the response JSON has "error" in it, then this is an error message..
if (jsonObject.has("error")) {
String errorMessage = jsonObject.get("error_description").toString();
throw new ApiException(errorMessage);
// Else, this is a valid response object. Return it.
} else {
return jsonObject;
}
} catch (JSONException e) {
throw new IOException("Error parsing JSON from response.");
}
}
我觉得很蠢。我现在知道为什么上面的代码不起作用了:
// These..
String string = response.body().toString();
JSONObject jsonObject = new JSONObject(response.body().toString());
// Should've been these..
String string = response.body().string();
JSONObject jsonObject = new JSONObject(response.body().string());
TL;DR 应该是 string()
而 不是 toString()
.