2017-09-18 4 views
0

0) J'utilise Retrofit 2 pour le travail avec Bank API.
1) J'ai une interface:Rénovation 2: @Query "encoded = false" ne fonctionne pas

public interface ApiService { 
    @GET("statdirectory/exchange") 
    Call<List<MyModel>> getСurrency(@Query("date") String inputDate); 
} 

2) Et quand je l'appelle méthode getСurrency (someParametr), où someParametr est une chaîne, se composer avec "date & JSON" (par exemple, « 20170917 & JSON "):

ApiService apiService = RetrofitController.getApi(); 
apiService.getCurrency("20170917&json").enqueue(new Callback<List<MyModel>>() { 

     @Override 
     public void onResponse(Call<List<MyModel>> call, Response<List<MyModel>> response) { 
      call.request().url(); 
      Log.e("URL", call.request().url()+""); 
      response.code(); 
      Log.e("CODE", response.code()+"");  
} 
//..... 

3) Je vois que:
URL: " https://bank.gov.ua/NBUStatService/v1/statdirectory/exchange?date=20170917% 26 JSON » (& est remplacé par % 26)
CODE: "404"
4) Interface Inmy i ajouter encodées:

getСurrency(@Query(value="date", encoded=false) String inputDate); 

Mais mon résultat est le même que dans étape 3!

5) Comment vérifier ce problème? Comment obtenir l'URL sans % 26 sur ma chaîne? J'ai lu d'autres questions avec un problème similaire, mais ne résout pas mon problème. Merci!

+0

pourquoi est exactement ce un problème? Et pourquoi avez-vous un param 'json' sans valeur? –

+0

@TimCastelijns, mon code complet est de travail, mais je ne sais pas pourquoi mon URL _20170917 & json_ encoder à _20170917% 26json_ et comment le résoudre. – Tomas

+0

Que voulez-vous réparer? Savez-vous même ce que l'encodage de l'URL est? –

Répondre

1

Comme indiqué ici https://github.com/square/okhttp/issues/2623 par swankjesse

Utilisez HttpUrl pour construire l'url

HttpUrl url = HttpUrl.parse("https://bank.gov.ua/NBUStatService/v1/statdirectory/exchange?date=20170916&json"); 

ensuite changer votre méthode appel à

@GET 
Call<List<MyModel>> getСurrency(@Url String ur); 

Puis

apiService.getCurrency(url.toString()) 
     .enqueue(new Callback<List<MyModel>>() { 

     @Override 
     public void onResponse(Call<List<MyModel>> call, retrofit2.Response<List<MyModel>> response) { 
      // your response 
     } 

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

     } 

    }); 

Autre moyen est d'utiliser Interceptor de Okhttp et remplacer% 26 par &

class MyInterceptor implements Interceptor { 
    @Override 
    Response intercept(Interceptor.Chain chain) throws IOException { 
    Request request = chain.request() 
    String stringurl = request.url().toString() 
    stringurl = stringurl.replace("%26", "&") 

    Request newRequest = new Request.Builder() 
     .url(stringurl) 
     .build() 

    return chain.proceed(newRequest) 
} 
} 

Puis

OkHttpClient client = new OkHttpClient.Builder(); 
client.addInterceptor(new MyInterceptor()); 
+0

Merci pour la réponse !!! Cela fonctionne pour moi!) Mais j'ai une réponse ... Comment utiliser votre deuxième voie avec "Interceptor Okhttp"?Où j'ai surchargé la méthode 'intercept'? – Tomas

+0

@Tomas vérifier l'édition – Raghunandan

+0

Je suis compris, merci!) – Tomas

0

votre JSON aura des données de valeur de clé. Essayez de passer en dessous du format. Il ajoutera automatiquement le & avant la clé Json.

getСurrency(@Query("date") String inputDate, @Query("key1") String value1, @Query("key2") String value2);