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.