gpt4 book ai didi

android - Retrofit2 反序列化响应主体,即使响应不是 200

转载 作者:太空狗 更新时间:2023-10-29 13:52:17 25 4
gpt4 key购买 nike

即使响应不成功,我也希望能够将网络响应反序列化到同一个 Java 对象。目前,当我收到类似 403 的错误响应时,响应主体为空,我应该使用 response.errorBody() 方法来读取已发回的任何内容,这没问题。但是我想避免在改造回调中有很多代码只是为了反序列化 errorBody。相反,我想要一个将 errorBody 的内容设置到正文中的拦截器。

这样做的原因是我有一个响应对象,它包含错误和非错误响应的字段,并且根据响应的状态,一些字段应该留空,例如

错误响应 JSON

{
"locked":true,
"remaining_attempts": 2
}

成功响应 JSON

{
"name":"kev"
"token":"abcdefghijklmnopq"
}

我创建了一个 Java 对象来捕获这两种情况:

class LoginResponse{
@Expose
private String name;
@Expose
private String token;
@Expose
private Boolean locked;
@Expose
private Integer remaining_attempts;
}

有没有办法在拦截器中做到这一点?

最佳答案

Retrofit 通过将其委托(delegate)给 Converter 来完成序列化部分,您可以使用 builder.addConverterFactory(GsonConverterFactory.create()) 将特定的一个添加到构建器并且已经有很多书面的 Retrofit Converters,你可以找到其中的大部分 here .

所以如果你想控制这个反序列化过程,你可以写你的自定义转换器,像这样

public class UnwrapConverterFactory extends Converter.Factory {

private GsonConverterFactory factory;

public UnwrapConverterFactory(GsonConverterFactory factory) {
this.factory = factory;
}

@Override
public Converter<ResponseBody, ?> responseBodyConverter(final Type type,
Annotation[] annotations, Retrofit retrofit) {
// e.g. WrappedResponse<Person>
Type wrappedType = new ParameterizedType() {
@Override
public Type[] getActualTypeArguments() {
// -> WrappedResponse<type>
return new Type[] {type};
}

@Override
public Type getOwnerType() {
return null;
}

@Override
public Type getRawType() {
return WrappedResponse.class;
}
};
Converter<ResponseBody, ?> gsonConverter = factory
.responseBodyConverter(wrappedType, annotations, retrofit);
return new WrappedResponseBodyConverter(gsonConverter);
}
}

然后您再次使用 addConverterFactory() 将新转换器告知 Retrofit。我应该提一下,您可以在 Retrofit 中使用多个转换器,这很棒,它只需按顺序检查转换器,直到找到合适的转换器。

资源:writing custom Retrofit converter , using multiple converters

关于android - Retrofit2 反序列化响应主体,即使响应不是 200,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44907027/

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