Retrofit 2: @Query "encoded=false" don't work

I just wanted to clarify that the original problem was that the encoded parameter needed to be true: encoded=true. This indicates that the value provided is already encoded and thus doesn't need to be re-encoded by retrofit. As is stated in the retrofit documentation, the default value of encoded is false. ie:

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

will result in the correct url being generated.

The documentation states the following regarding the encoded parameter:

Specifies whether the parameter name and value are already URL encoded.

Source: https://square.github.io/retrofit/2.x/retrofit/index.html?retrofit2/http/Query.html


As noted here https://github.com/square/okhttp/issues/2623 by swankjesse

Use HttpUrl to build the url

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

Then change your method call to

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

Then

 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) {

        }

    });

Other way is to use Okhttp's Interceptor and replace %26 by &

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

Then

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