我使用的API成功返回Json对象{ "results": 1, "data": [...]}
,错误返回网页“ <DOCTYPE HTML> <HTML>.... </HTML>
”。我该如何处理?我在Java中的Android上使用Retrofit 2和Gson。当数据项出现错误时,我还使用两个自定义反序列化器来处理返回的字符串而不是对象。
答案 0 :(得分:1)
您是否尝试过使用OkHttp3 ResponseBody进行呼叫,并且根据响应的类型或者用Gson解析Json还是显示错误?
例如,您可以创建一个确定字符串是否为gson的函数,如下所示:
public static boolean isJson(String Json) {
Gson gson = new Gson();
try {
gson.fromJson(Json, Object.class);
return true;
} catch (com.google.gson.JsonSyntaxException ex) {
return false;
}
}
然后像这样进行改造:
Call<ResponseBody> res = yourService.yourmethod();
res.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
if (response.isSuccessful()) {
try {
String resString = response.body().string();
if (isJson(resString)) {
Gson gson = new Gson();
YourModel responseObject = gson.fromJson(resString, YourModel.class);
// do something with the object
} else { // this is not a Json so most likely your html response
// Do something else, like display an error
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
t.printStackTrace();
}
});
如果您需要解析html以显示返回的内容,则也可以使用Jsoup,这类似于Document document = Jsoup.parse(resString);
,然后对结果进行所需的操作。
您还可以选择使用WebView,并使用webView.loadData(resString, "text/html", "UTF-8");
答案 1 :(得分:0)
根据响应代码,您可以处理它,但后端应多加注意。后端开发人员应提供正确的错误消息以及响应代码。
答案 2 :(得分:0)
如果API错误返回SeqUtils.sneakyThrow
以外的内容,则可以有所不同:
HTTP 200 OK