Избегайте кодирования данных при создании URL

Я пытаюсь вызвать так:

 @GET(AppConstants.BASE_URL + "{category_type}/")
    Call<JsonObject> callCustomFilterApI(@Path("category_type") String type,
                                         @QueryMap(encoded = true)  Map<String,String> fields ,
                                         @Query("page") String pageNo);

Но @QueryMap может иметь в данных "&", поэтому модифицируйте его кодирование в % 26.

В любом случае "&" не меняйте на "% 26".

Решение, которое я пробовал:

  1. Решение, упомянутое здесь

  2. установка encoded = true / false

  3. А также этот.

    @DebDeep спросил:

Я передаю данные в QueryMap как:

 private void callCustomFilterSearchPagesApi(String type,  ArrayList<FilterListWithHeaderTitle> customFiltersList, int pageNumber, final ApiInteractor listener) {
        Map<String, String> queryMap = new HashMap<>();

            for (FilterListWithHeaderTitle item: customFiltersList) {

                String pairValue;
                if (queryMap.containsKey(item.getHeaderTitle())){
                    // Add the duplicate key and new value onto the previous value
                    // so (key, value) will now look like (key, value&key=value2)
                    // which is a hack to work with Retrofit's QueryMap

                    String oldValue=queryMap.get(item.getHeaderTitle());
                    String newValue = "filters[" + item.getHeaderTitle() + "][]"
                            +oldValue+ "&"+"filters[" + item.getHeaderTitle() + "][]"+item.getFilterItem();
                    pairValue=newValue;
                }else {
                    // adding first time
                    pairValue= item.getFilterItem();
                }
                try {
                    //pairValue= URLEncoder.encode(pairValue, "utf-8");
                   // LoggerUtils.logE(TAG,pairValue);
                    //queryMap.put(item.getHeaderTitle(), Html.fromHtml(pairValue).toString());
                    queryMap.put(item.getHeaderTitle(), pairValue);

                }catch (Exception u){
                    LoggerUtils.crashlyticsLog(TAG,u.getMessage());
                }

            }
            Call<JsonObject> call = TagTasteApplicationInitializer.mRetroClient.callCustomFilterApI(type, queryMap, "1");
            requestCall(call, listener);
    }
github.com/square/retrofit/issues/1199
AskNilesh 09.04.2018 07:12

Параметр значения @NileshRathod недоступен для поля QueryMap

Ankur_009 09.04.2018 07:12
futurestud.io/tutorials/…
AskNilesh 09.04.2018 07:13

Как вы добавляете данные в QueryMap?

Debdeep 09.04.2018 07:16

Используйте OkHttpInterceptor для замены сгенерированной строки URL

Debdeep 09.04.2018 07:24
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
4
5
148
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Используйте Interceptor и конвертируйте %26 в &:

class RequestInterceptor 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);
    }
}

Установите это для вашего компоновщика OkHttp:

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

Другие вопросы по теме