gpt4 book ai didi

android - 我们如何使用 Retrofit 2 处理不同的响应类型?

转载 作者:IT老高 更新时间:2023-10-28 22:17:41 24 4
gpt4 key购买 nike

我有一个 web 服务,它返回一个序列化的 MyPOJO 对象列表:

[
{ //JSON MyPOJO },
{ //JSON MyPOJO }
]

一个错误对象:

{  
'error': 'foo',
'message':'bar'
}

使用retrofit2,如何找回错误?

Call<List<MyPOJO>> request = ...
request.enqueue(new Callback<List<MyPOJO>>() {
@Override
public void onResponse(Response<List<MyPOJO>> response) {
if (response.isSuccess()) {
List<MyPOJO> myList = response.body();
// do something with the list...
} else {
// server responded with an error, here is how we are supposed to retrieve it
ErrorResponse error = ErrorResponse.fromResponseBody(apiService.getRetrofitInstance(), response.errorBody());
processError(error);
// but we never get there because GSON deserialization throws an error !
}
}

@Override
public void onFailure(Throwable t) {
if(t instanceof IOException){
// network error
}else if(t instanceof IllegalStateException){
// on server sending an error object we get there
// how can I retrieve the error object ?
}else {
// default error handling
}
}
}

这是 GSON 异常:

java.lang.IllegalStateException: Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2 path $

Retrofit 实例是使用 GsonConverterFactory 创建的

最佳答案

我遇到了类似的问题,我通过使用通用 Object 解决了它,然后使用 instanceof 测试了我的响应类型

Call<Object> call = api.login(username, password);
call.enqueue(new Callback<Object>()
{
@Override
public void onResponse(Response<Object> response, Retrofit retrofit)
{
if (response.body() instanceof MyPOJO )
{
MyPOJO myObj = (MyPOJO) response.body();
//handle MyPOJO
}
else //must be error object
{
MyError myError = (MyError) response.body();
//handle error object
}
}

@Override
public void onFailure(Throwable t)
{
///Handle failure
}
});

在我的情况下,我返回了 MyPOJO 或 MyError,我可以确定它会是其中之一。

在其他情况下,无论请求是否成功,我都会让后端返回相同的响应对象。
然后在这个响应对象中,我在“对象”字段中有我的实际数据。然后我可以使用 instance of 来确定我拥有的数据类型。在这种情况下,无论调用是什么,我总是返回相同的对象。

public class MyResponse {

private int responseCode;
private String command;
private int errorno;
private String errorMessage;
private Object responseObject; //This object varies depending on what command was called
private Date responseTime;
}

关于android - 我们如何使用 Retrofit 2 处理不同的响应类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35583308/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com