Java 改进动态响应底座

Java 改进动态响应底座,java,android,android-studio,retrofit,retrofit2,Java,Android,Android Studio,Retrofit,Retrofit2,我计划使用翻新技术制作一个公共服务类 @GET Call<ResponseBody> makeGetRequest(@Url String url); @POST Call<ResponseBody> makePostRequest(@Url String url, @Body RequestBody parameters); 所以,在得到改造的结果之后,我们再次需要转换为gson.fromJson 所以我想将动态响应作为改装传递,这样它将根据我的pojo类进行响应

我计划使用翻新技术制作一个公共服务类

@GET
Call<ResponseBody> makeGetRequest(@Url String url);

@POST
Call<ResponseBody> makePostRequest(@Url String url, @Body RequestBody parameters);
所以,在得到改造的结果之后,我们再次需要转换为gson.fromJson

所以我想将动态响应作为改装传递,这样它将根据我的pojo类进行响应

当我通过LoginRes而不是ResponseBy时,我知道这很好,因为我已经告诉Response,我们需要LoginRes中的响应

所以如果我通过

Call<LoginRes> // if i pass this way its working fine no need to convert my response i can access my all properties from that LoginRes class directly. 
Call//如果我通过这种方式,它工作正常,无需转换我的响应,我可以直接从LoginRes类访问我的所有属性。
这是我调用Web服务的示例

Call<ResponseBody> call = apiService.makePostRequest("/Buyer/LoginApp", requestBody);
Call Call=apiService.makePostRequest(“/Buyer/LoginApp”,requestBody);
这就是我所说的服务

如果我对问题的解释不清楚,请告诉我

等待一些好的回应和建议

谢谢
Madhav

这有点棘手,但您需要使用自定义改装转换器工厂和使用自定义JsonDeserializer的自定义GsonBuilder

此外,您应该定义一个接口(
customresponse
,在我的示例中)来使用CustomJsonDeserializer。这是不需要的,但除此之外,反序列化器将用于每个请求

public class CustomConverterFactory {

    public static GsonConverterFactory create() {
        return GsonConverterFactory.create(createGsonCustomDeserializer());
    }

    public static Gson createGsonCustomJsonDeserializer() {
        return new GsonBuilder()
            .registerTypeAdapter(CustomResponse.class, new CustomJsonDeserializer())
            .serializeNulls()
            .create();
    }
}
对于反序列化程序:

public class CustomJsonDeserializer implements JsonDeserializer<CustomResponse> {

@Override
public CustomResponse deserialize(final JsonElement json, final Type typeOfT,
        final JsonDeserializationContext context) throws JsonParseException {
    if (json.isJsonObject()) {
        JsonObject jsonObject = json.getAsJsonObject();

        // Here you have to distinguish your class somehow
        // Maybe read some Json field from your response
        if (jsonObject.has("name")) {
            JsonElement classes = jsonObject.get("name");
            ...
            return context.deserialize(json, MyName.class);
        }
        ...
        // Default fallback: Deserialize as a fallback object
        return context.deserialize(json, MyFallback.class);
    } else {
        throw new IllegalStateException();
    }
}
公共类CustomJsonDeserializer实现JsonDeserializer{
@凌驾
公共CustomResponse反序列化(最终JsonElement json,最终类型typeOfT,
最终JsonDeserializationContext)抛出JsonParseException{
if(json.isJsonObject()){
JsonObject JsonObject=json.getAsJsonObject();
//在这里,你必须以某种方式区分你的班级
//也许可以从您的响应中读取一些Json字段
if(jsonObject.has(“name”)){
JsonElement类=jsonObject.get(“名称”);
...
反序列化(json,MyName.class);
}
...
//默认回退:反序列化为回退对象
反序列化(json,MyFallback.class);
}否则{
抛出新的非法状态异常();
}
}

这有点棘手,但您需要使用自定义改装转换器工厂和使用自定义JsonDeserializer的自定义GsonBuilder

此外,您应该定义一个接口(
customResonase
,在我的示例中)来使用CustomJsonDeserializer。这是不需要的,但除此之外,反序列化器将用于每个请求

public class CustomConverterFactory {

    public static GsonConverterFactory create() {
        return GsonConverterFactory.create(createGsonCustomDeserializer());
    }

    public static Gson createGsonCustomJsonDeserializer() {
        return new GsonBuilder()
            .registerTypeAdapter(CustomResponse.class, new CustomJsonDeserializer())
            .serializeNulls()
            .create();
    }
}
对于反序列化程序:

public class CustomJsonDeserializer implements JsonDeserializer<CustomResponse> {

@Override
public CustomResponse deserialize(final JsonElement json, final Type typeOfT,
        final JsonDeserializationContext context) throws JsonParseException {
    if (json.isJsonObject()) {
        JsonObject jsonObject = json.getAsJsonObject();

        // Here you have to distinguish your class somehow
        // Maybe read some Json field from your response
        if (jsonObject.has("name")) {
            JsonElement classes = jsonObject.get("name");
            ...
            return context.deserialize(json, MyName.class);
        }
        ...
        // Default fallback: Deserialize as a fallback object
        return context.deserialize(json, MyFallback.class);
    } else {
        throw new IllegalStateException();
    }
}
公共类CustomJsonDeserializer实现JsonDeserializer{
@凌驾
公共CustomResponse反序列化(最终JsonElement json,最终类型typeOfT,
最终JsonDeserializationContext)抛出JsonParseException{
if(json.isJsonObject()){
JsonObject JsonObject=json.getAsJsonObject();
//在这里,你必须以某种方式区分你的班级
//也许可以从您的响应中读取一些Json字段
if(jsonObject.has(“name”)){
JsonElement类=jsonObject.get(“名称”);
...
反序列化(json,MyName.class);
}
...
//默认回退:反序列化为回退对象
反序列化(json,MyFallback.class);
}否则{
抛出新的非法状态异常();
}
}
既然这么多用户投了反对票,我已经解决了这个问题 我的问题是

处理GET、POST或其他类似方法,

if (methodType.equalsIgnoreCase(CommonConfig.WsMethodType.GET)) {
                apicall = getClient(CommonConfig.WsPrefix).create(ApiInterface.class).makeGetRequest(url + CommonConfig.getQueryString(new Gson().toJson(requestBody)), getAllHeader);
 } else if (methodType.equalsIgnoreCase(CommonConfig.WsMethodType.POST)) {
                apicall = getClient(CommonConfig.WsPrefix).create(ApiInterface.class).makePostRequest(url, RequestBody.create(MediaType.parse("application/json"), new Gson().toJson(requestBody)), getAllHeader);
 }
像这样处理响应。

apicall.enqueue(new Callback<ResponseBody>() {
                                @Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
}

 @Override
 public void onFailure(Call<ResponseBody> call, Throwable t) {

}
}
通用接口

private Retrofit getClient(String WsPrefix) {
        //TODO 60 to 30 second at everywhere
        OkHttpClient okHttpClient = new OkHttpClient().newBuilder()
                .connectTimeout(60, TimeUnit.SECONDS)
                .readTimeout(60, TimeUnit.SECONDS)
                .writeTimeout(60, TimeUnit.SECONDS)
                .build();

        retrofit = new Retrofit.Builder()
                .baseUrl(WsPrefix)
                .client(okHttpClient)
                .build();
        return retrofit;
    }
interface ApiInterface {

        @GET
        Call<ResponseBody> makeGetRequest(@Url String url, @HeaderMap() Map<String, String> header);

        @POST
        Call<ResponseBody> makePostRequest(@Url String url, @Body RequestBody requestBody, @HeaderMap() Map<String, String> header);
}
既然这么多用户投了反对票,我已经解决了这个问题 我的问题是

处理GET、POST或其他类似方法,

if (methodType.equalsIgnoreCase(CommonConfig.WsMethodType.GET)) {
                apicall = getClient(CommonConfig.WsPrefix).create(ApiInterface.class).makeGetRequest(url + CommonConfig.getQueryString(new Gson().toJson(requestBody)), getAllHeader);
 } else if (methodType.equalsIgnoreCase(CommonConfig.WsMethodType.POST)) {
                apicall = getClient(CommonConfig.WsPrefix).create(ApiInterface.class).makePostRequest(url, RequestBody.create(MediaType.parse("application/json"), new Gson().toJson(requestBody)), getAllHeader);
 }
像这样处理响应。

apicall.enqueue(new Callback<ResponseBody>() {
                                @Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
}

 @Override
 public void onFailure(Call<ResponseBody> call, Throwable t) {

}
}
通用接口

private Retrofit getClient(String WsPrefix) {
        //TODO 60 to 30 second at everywhere
        OkHttpClient okHttpClient = new OkHttpClient().newBuilder()
                .connectTimeout(60, TimeUnit.SECONDS)
                .readTimeout(60, TimeUnit.SECONDS)
                .writeTimeout(60, TimeUnit.SECONDS)
                .build();

        retrofit = new Retrofit.Builder()
                .baseUrl(WsPrefix)
                .client(okHttpClient)
                .build();
        return retrofit;
    }
interface ApiInterface {

        @GET
        Call<ResponseBody> makeGetRequest(@Url String url, @HeaderMap() Map<String, String> header);

        @POST
        Call<ResponseBody> makePostRequest(@Url String url, @Body RequestBody requestBody, @HeaderMap() Map<String, String> header);
}

所以你想要一个能将JSON响应转换成各种可能完全不相关的类的函数吗?事实上,如果我能用ResponseBy动态传递或者以不同的方式传递..我需要一些建议。所以你想要一个能将JSON响应转换成各种可能完全不相关的类的函数es?事实上,如果我可以通过ResponseBook动态或其他方式…我需要建议。我知道这种方式…但要做到这一点还有很长的路…仍然感谢你的回复…要么你在执行请求之前知道你想要的类,要么你必须走这条路。谢谢你,我仍然在寻找一些好的解决方案…我有这样..对于计划b.问题,如果我在我的中使用此方法,并且从服务器收到的一些响应将是一个对象(即用户对象或事件对象列表),但有些是纯布尔/字符串),这种方法仍然有效吗?我知道这种方法。但要做到这一点还有很长的路要走。仍然感谢你的回答。要么你在完成请求之前知道你想要的类,要么你必须走这条路。谢谢你,我仍然在寻找一些好的解决方案。我有这个方法。计划b。探索ion,如果我在我的中使用此方法,并且从服务器收到的一些响应将是一个对象(即用户对象或事件对象列表),但有些将是纯布尔值/字符串),此方法仍然有效吗?