2017-02-15 1 views
0

J'ai vérifié beaucoup de référence avant de poser réellement la question. Comme la plupart des gens, j'appelle un service web et obtenir le résultat ci-dessus. Mon problème est un peu plus précis, donc avant de demander moi d'ajouter mon code snippet

public static WebService getRestService(String newApiBaseUrl, String accessToken) 
    { 
     OkHttpClient.Builder httpClient = new OkHttpClient.Builder(); 


     if (BuildConfig.DEBUG) { 
      HttpLoggingInterceptor logging = new HttpLoggingInterceptor(); 
      logging.setLevel(HttpLoggingInterceptor.Level.BODY); 
      httpClient.addInterceptor(logging); 
     } 


     Gson gson = new GsonBuilder() 
       .setLenient() 
       .create(); 

     restBuilder = new Retrofit.Builder() 
       .baseUrl(newApiBaseUrl) 
       .client(httpClient.build()) 
       .addConverterFactory(GsonConverterFactory.create(gson)); 

     if (accessToken != null) { 
      AuthenticationInterceptor interceptor = 
        new AuthenticationInterceptor(accessToken); 

      if (!httpClient.interceptors().contains(interceptor)) { 
       httpClient.addInterceptor(interceptor); 

       restBuilder.client(httpClient.build()); 
      } 
     } 

     retrofit = restBuilder.build(); 
     return retrofit.create(WebService.class); 
    } 

S'il vous plaît ignorer l'interprète. C'est ma classe de générateur de service à travers laquelle tous les services Web sont appelés. J'appelle une méthode POST qui me retournera une réponse simple.

Je peux voir ma réponse correcte dans "Android Monitor". Mais quand ça passe à travers JsonConverterFactory, ça me donne l'erreur ci-dessus. Une chose que je sais avec certitude, c'est que le service web renvoie une simple réponse textuelle car il n'y a rien de spécifique à retourner à l'application. Existe-t-il un moyen par lequel je peux convertir ma réponse de texte en classe. S'il vous plaît libérer cri si j'ai raté quelque chose.

également ajouter ma méthode d'interface

@Headers({ 
      Constants.ApiHeader.CONTENT_TYPE_JSON 
    }) 

    @POST("POST_URL/{number}") 
    Call<MyResponseModel> getActualProductLocation(@Header("access_token") String accessToken, @Path("number") String number, @Body List<MyRequestModel> body); 

Mise à jour j'ai réussi à obtenir une partie de l'extrait de code du serveur. C'est ce que leur réponse ressemble à:

Response.status(200).entity("Response Success").build() 
+0

post 'MyResponseModel'. Très probablement, il n'est pas dans le bon format. – azizbekian

+0

Il est vide car il n'y a pas de paire de valeur de clé retournée par le serveur (données JSON). Dois-je définir une variable de chaîne dans la classe? – Android

+0

* Mon problème est plutôt plus précis * comment? Ces problèmes sont tous les mêmes: les données json ne sont pas ce que le convertisseur attendait. Il est possible que le convertisseur gson ne trouve pas une seule chaîne valide json (il est, cependant) –

Répondre

0

Parce que le back-end ne vous répond pas avec des données au format JSON, vous devez le manipuler avec convertisseur de mesure.

Here's un exemple de convertisseur personnalisé qui répondrait à vos besoins.

Un extrait de StringConverterFactory.java

... 
private static class StringConverter implements Converter<String> { 
    private static final MediaType PLAIN_TEXT = MediaType.parse("text/plain; charset=UTF-8"); 

    @Override 
    public String fromBody(ResponseBody body) throws IOException { 
     return new String(body.bytes()); 
    } 

    @Override 
    public RequestBody toBody(String value) { 
     return RequestBody.create(PLAIN_TEXT, convertToBytes(value)); 
    } 

    private static byte[] convertToBytes(String string) { 
     try { 
      return string.getBytes("UTF-8"); 
     } catch (UnsupportedEncodingException e) { 
      throw new RuntimeException(e); 
     } 
    } 
} 
... 

Et puis lors de la création de vos Retrofit:

Retrofit retrofit = new Retrofit.Builder() 
    ... 
    .addConverterFactory(StringConverterFactory.create()); 
    ... 
    .build(); 
+0

Hey Merci mon pote, je vais essayer. J'ai une question. Si je commence à utiliser un convertisseur personnalisé, je suppose que je serais toujours en mesure d'utiliser mon convertisseur général, et il ne serait pas interférer avec mon convertisseur existant. Est-ce correct? – Android

+0

Vous pouvez avoir un convertisseur par instance Retrofit. Vous ne pouvez pas les changer dynamiquement. Si vous voulez avoir différents convertisseurs, vous devez initialiser différentes instances Retrofit avec ces convertisseurs. – azizbekian

+0

J'ai un problème avec les importations. Ces classes appartiennent-elles à la rénovation? Paquet comme 'importer retrofit2.Converter;' – Android