Почему Retrofit пропускает определенные символы из моего запроса URL?

Обновление: проблема НЕ связана с необходимостью кодирования URL. Это делается с помощью Retrofit. Если я кодирую URL-адрес, а затем передаю его в Retrofit, URL-адрес кодируется дважды и в конечном итоге выглядит следующим образом:

https://s

Обратите внимание на %257C. Первый раунд | -> %7C. Второй тур %7C -> %257C

Я пытаюсь выполнить HTTP-запрос GET с помощью Retrofit. Запрос выглядит следующим образом: https://s

В коде вызов выглядит так

@GET("get_user_info")
Call<ResponseBody> getUserMeta(
            @Query("id") int userId,
            @Query("cookie") String cookie
);

Когда я выполняю этот запрос, Request выглядит так:

Request{method=GET, url=https://example.com/api/get_user_info/?id=12345&[email protected]|1492357107|fyVzRUYC9h|4f889e1976c2cd87aac, tag=null}

(Взято из консоли после логирования call.request().toString())

После выполнения вызова я получаю сообщение об ошибке от своего API о том, что файл cookie недействителен. Ответ выглядит следующим образом:

Response{protocol=h2, code=404, message=, url=https://example.com/api/get_user_info/?id=12345&[email protected]}

(Взято из консоли после входа Response<ResponseBody> response.toString())

Как видите, два URL-адреса не совпадают. Символ | каким-то образом был удален из параметра cookie в URL-адресе ответа.

Вы можете подумать, что это как-то связано с моим API и что файл cookie на самом деле неверен, но если я скопирую и вставлю URL-адрес Request прямо в свой браузер, он будет выполнен без ошибок (статус 200). Если Retrofit выполняет вызов, я получаю 404.

Очевидно, что Retrofit выполняет второй, неверный URL. Это явно так, потому что первый URL-адрес не возвращает 404 при выполнении в браузере, а второй возвращает.

Что происходит? Любая помощь приветствуется.

Дополнительная информация:

Я использую compile 'com.squareup.retrofit2:retrofit:2.2.0' в моем модуле приложения build.gradle.

Я создаю экземпляр своего клиента Retrofit следующим образом:

Retrofit retroFit = new Retrofit.Builder()
                    .baseUrl("https://example.com/api/")
                    .build();

person matthewtory    schedule 23.06.2017    source источник
comment
URL Кодировать канал с помощью %7C   -  person Compass    schedule 23.06.2017


Ответы (1)


Вы должны реализовать encoding в ваших файлах cookie:

@FormUrlEncoded
@GET("get_user_info")
Call<ResponseBody> getUserMeta(
    @Query("id") int userId,
    @Query(value ="cookie", encode = true) String cookie

    );
person Community    schedule 23.06.2017
comment
Модернизация вызывает исключение: java.lang.IllegalArgumentException: FormUrlEncoded can only be specified on HTTP methods with request body (e.g., @POST). - person Vasilisfoo; 16.07.2017
comment
@Vasilisfoo, было бы неплохо, если бы вы задали новый вопрос с некоторым кодом. - person ; 16.07.2017
comment
@Ibrahim, это было бы дубликатом, у меня точно такая же проблема, символ трубы удаляется из файла cookie. Я пробовал то, что вы предлагаете, но безуспешно. - person Vasilisfoo; 16.07.2017
comment
@Vasilisfoo, кажется, это не та же проблема, вы делаете что-то незаконное, возможно, вы не указали @FormUrlEncoded только для метода модификации. - person ; 16.07.2017