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

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

@GETCall<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());


If you still got this problem, I have 2 solutions.

FIRST SOLUTION:

// Create a URL object and pass to constructor your urlURL urlObject = new URL(url);// Create connectionHttpURLConnection connection = (HttpURLConnection) urlObject.openConnection();// SET 'GET' requestconnection.setRequestMethod("GET");connection.connect();// Create stream to read outputInputStream inputStream = connection.getInputStream();// Craete buffer to gain all outputStringBuffer stringBuffer = new StringBuffer();AND HERE IS THE KEYYOU CREATE A BUFFERREADER AND SET CP1251 SO URL`S GONNA BE ENCODEDBufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream, "cp1251"));// Read untill endString line;while ((line = bufferedReader.readLine()) != null) {    stringBuffer.append(line);}// HERE IS YOUR JSON RESULTresultJson = stringBuffer.toString();

SECOND SOLUTION:

Just add encoded = true to your @Query annotation

@GET("some_path")    Call<RequestBody> function(@Query(value = "param", encoded = true) String your_param);

That's it! All that worked well for me. If you have some comments or questions, I will answer them.