3

我必须使用使用JSend格式的 API。

长话短说,它使用 HTTP 状态代码来指示状态,例如:

  • 200是成功
  • 406 未经授权

这很好,因为我可以从中确定我的 API 请求是否成功。

但:

由于 JSend 格式有它自己的东西,它在响应时也有一个小的状态指示器,就像这样:

{
    status : "success",
    data : { "post" : { "id" : 2, "title" : "Another blog post", "body" : "More content" }}
}

所以它有一个“状态”字段,它还显示 API 请求是否成功。

问题:

进行改造以解析对 POJO 的响应,因此它假定响应仅包含模型并且没有成功指标,例如:(模型后实例)

{ "id" : 2, "title" : "Another blog post", "body" : "More content" }

我的问题是:

有解决方案吗?我可以预先解析状态指示符,拆分响应的“数据”(模型)部分,然后对其进行改造以仅解析该部分吗?

如果不是,我将不得不为我的每个模型添加一个“状态”属性,这显然不是一种可步行的方式,我不会那样做。

我是否应该坚持手动解析并使用ResponseBody而不是我的模型

void onResponse(Call<T> call, Response<T> response);类型T参数?

因为这样我可以使用.string()字符串并将其转换为 JSON,然后我可以手动解析我的模型,就像为它们编写解析器一样。

我真的很想使用 Retrofit 的功能进行自动解析,因为使用JSend我无法想象如果无论如何都可以正确完成这项工作。

我无法更改 API,它将是这种方式。

4

3 回答 3

4

这是我的Response课。

public class Response<T> implements Serializable {
private T data;
private String status;

public T getData() {
    return data;
}

public void setData(T data) {
    this.data = data;
}

public String getStatus() {
    return status;
}

public void setStatus(String status) {
    this.status = status;
}

}

这是我的api调用。

Callback<com.shippn.api.models.Response<T>> callback = new Callback<com.shippn.api.models.Response<T>>() {
        @Override
        public void onResponse(Call<com.shippn.api.models.Response<T>> call, Response<com.shippn.api.models.Response<T>> response) {
            checkStatus(response.body());
        }

        @Override
        public void onFailure(Call<com.shippn.api.models.Response<T>> call, Throwable t) {
            fail();
        }
    };
    call.enqueue(callback);

T参数是来自 api 的数据类型。我的意思是,如果您想获取Post类型为 put Postinsted 的数据T。如果你想得到ArrayList<Post>put ArrayList<Post>

如果data您的 api 响应中的字段为空或 null,Response.data将为 null 或空,它不会引发异常。

当您从 api 获得响应时,首先检查Response.status它是否“成功”。如果是“成功”,则从 获取数据Response,如果不是,则采取错误措施。

于 2017-03-07T07:59:43.350 回答
0

您可以做的是您可以在不使用它的情况下获得发布请求的状态。问题是参数名称不是字符串,不会在 POJO 中解析。但是您可以像这样获取请求的状态。

@Override
            public void onResponse(Call<Object> call, retrofit2.Response<Object> response) {
                alertDialog.dismiss();
                if (response.isSuccessful() && response.body() != null) {
                    //if the response is received here it means it was success
                }else if(response.errorBody()!=null){
                    //if the response is received here it means it was error
                }
            }

            @Override
            public void onFailure(Call<Object> call, Throwable t) {
                //if the response is received here it means it was failure
                t.printStackTrace();
            }
        });

编辑 通过这种方式,您可以获得使用 pojo 的状态,并且您可以像在此链接中一样简单地解析错误

编辑 1 此外,为了获得正确的错误代码,您可以将回调类扩展到类似的类

public class ErrorValues {
    public int code=0;
    public String error;
}

然后如果请求完成但有错误。里面

else if(response.errorBody()!=null){
 int error=response.body.code == 404 ....
                    }

像这样,您可以检查请求抛出了哪个错误代码。

于 2017-03-06T12:16:29.497 回答
0

一种可能的方法是为您的模型创建一个包装器,例如

public class Example<T> {
    String status;
    T data;

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }
}
于 2017-03-06T12:18:29.167 回答