2016-07-28 2 views
-1

Я планирую сделать один общий класс обслуживания с использованием модернизированных,дооснащения Dynamic ResponseBody

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

@POST 
Call<ResponseBody> makePostRequest(@Url String url, @Body RequestBody parameters); 

В этом коде мне нужно передать (ResponseBody) как динамическое имя класса JSON POJO, Как LoginRes

Скажем, например,

Call<LoginRes> // But this class will be dynamic 

Я пройду ResponseBody но ResponseBody не знает, какой класс я хотел отдать предпочтение.

почему я хочу это, потому что, после того, как результат

gson.fromJson(response, LoginRes.class); 

так, после получения результата от Модернизированный нам снова нужно преобразовать в gson.fromJson.

так я хотел передать динамический отклик как Модернизированный таким образом, что это будет ответ в соответствии с моим классом Pojo,

Я знаю, что это работает нормально, когда я прохожу LoginRes вместо ResponseBody, потому что, как я уже сказал в ответ, что мы нужен этот ответ в 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<ResponseBody> call = apiService.makePostRequest("/Buyer/LoginApp", requestBody); 

Так я звоню в Службу.

Дайте мне знать, если я неясен с объяснением моей проблемы.

Ожидание хорошего ответа и предложений по этому вопросу.

Благодаря Madhav

+0

Итак, вы хотите иметь ту же функцию, которая может преобразовывать ответ JSON в различные, возможно, совершенно не связанные классы? – NitroNbg

+0

Фактически, если я могу пройти с ResponseBody динамически или по-другому .. Мне нужны предложения по этому поводу. –

ответ

0

Поскольку многие пользователи дали до голосования, я уже решил эту вопрос моим сам,

Ручка GET , ПОЧТОВЫЙ ИЛИ ДРУГОЙ метод.

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; 
    } 

Common Interface

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); 
} 

ApiCallback

public interface ApiCallback { 
     void success(String responseData); 
     void failure(String responseData); 
} 
1

Это немного сложно, но вы должны будете использовать пользовательские дооснащения Converter Factory с обычаем GsonBuilder, который использует пользовательский JsonDeserializer.

Кроме того, вы должны определить интерфейс (CustomResonse в моем примере), для которого используется CustomJsonDeserializer. Это не нужно, но в противном случае Deserializer будет использоваться для каждый.

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(); 
    } 
} 
+0

Я знаю этот путь .. но это долгий путь для этого .. все еще спасибо за ваш ответ. –

+1

Либо вы знаете свой желаемый класс, прежде чем выполнять этот запрос, либо вам нужно идти этим путем. – dipdipdip

+0

спасибо за это, я все еще ищу какое-то хорошее решение .. у меня есть этот путь .. для плана b. –