gpt4 book ai didi

android - 在 Retrofit 中序列化查询参数

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:17:08 33 4
gpt4 key购买 nike

想象一下以下请求:

@POST("/recipes/create")
void createRecipe(@Query("recipe") Recipe recipe, Callback<String> callback);

我想要 toJson(recipe),但不幸的是,我的请求只是为我的食谱调用 toString(),这根本不起作用。

我可以覆盖 Recipe 中的 toString,但我宁愿有一个通用的解决方案。

我不能使用@Body,因为我需要指定我要发送的内容(我需要有“recipe=json(theRecipe)”。

我也无法更改序列化以添加“recipe=”,因为我不负责服务器。

目前我正在使用一个 QueryMap 映射,我在其中放入了一个序列化对象。虽然这可行,但在我看来这不是一个很好的解决方案。

我能以某种方式拦截 retrofit 适配器吗?

最佳答案

现在可以在注册覆盖 stringConverter 方法的自定义 Converter.Factory 时实现,该方法在解析参数时被调用。 Github issue自从添加了支持以来,@William 2 年前提到的那个似乎没有更新。

方法 Javadoc:

Returns a Converter for converting type to a String, or null if type cannot be handled by this factory. This is used to create converters for types specified by @Field, @FieldMap values, @Header, @HeaderMap, @Path, @Query, and @QueryMap values.

下面的示例委托(delegate)给 Gson,但同样可以对参数应用任何类型的转换。

示例:GsonStringConverterFactory

class GsonStringConverterFactory
extends Converter.Factory {

private final transient Gson gson;

GsonStringConverterFactory(final Gson gson) {

this.gson = gson;
}

@Override
public Converter<?, String> stringConverter(final Type type, final Annotation[] annotations, final Retrofit retrofit) {

final TypeAdapter typeAdapter;
typeAdapter = gson.getAdapter(TypeToken.get(type));

return new StringConverter<>(typeAdapter);
}

private static class StringConverter<T>
implements Converter<T, String> {

private final TypeAdapter<T> typeAdapter;

private StringConverter(final TypeAdapter<T> typeAdapter) {

this.typeAdapter = typeAdapter;
}

@Override
public String convert(final T value)
throws IOException {

/* This works in our case because parameters in this REST api are always some kind of scalar
* and the toJson method converts these to simple json types. */
final String jsonValue;
jsonValue = typeAdapter.toJson(value));

if (jsonValue.startsWith("\"") && jsonValue.endsWith("\"") {
/* Strip enclosing quotes for json String types */
return jsonValue.substring(1, jsonValue.length() - 1);
} else {
return jsonValue;
}
}
}
}

注册转换器:

要注册自定义转换器,您的 Retrofit 构建器可能如下所示:

    new Retrofit.Builder().baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create(gson))
.addConverterFactory(new GsonStringConverterFactory(gson))
.build();

关于android - 在 Retrofit 中序列化查询参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28510056/

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