Закодируйте и Декодируйте rfc2396 URL

К сожалению, модификация ( текущей версии 2.5.0 ) должна быть инициализирована с помощью baseUrl , который впоследствии не может быть изменен. Однако в определении конечных точек вашего интерфейса вы можете передать аннотированный параметр @Url (см. Предыдущий ответ от Nanda Z) или вы можете создать несколько экземпляров Retrofit (с другим baseUrl, используя аннотацию @Named ). ), который будет предоставлен Dagger. Например:

@Provides
@Named("myCoolRetrofitInstance1")
@Singleton
Retrofit provideRetrofit1(Gson gson, OkHttpClient okHttpClient) {
    Retrofit retrofit = new Retrofit.Builder()
            .addConverterFactory(GsonConverterFactory.create(gson))
            .baseUrl(SOME_URL_1)
            .client(okHttpClient)
            .build();
    return retrofit;
}

@Provides
@Named("myCoolRetrofitInstance2")
@Singleton
Retrofit provideRetrofit2(Gson gson, OkHttpClient okHttpClient) {
    Retrofit retrofit = new Retrofit.Builder()
            .addConverterFactory(GsonConverterFactory.create(gson))
            .baseUrl(SOME_URL_2)
            .client(okHttpClient)
            .build();
    return retrofit;
}

И для инъекций вы должны также использовать правильную аннотацию @Named.

@Inject
@Named("myCoolRetrofitInstance1") // or @Named("myCoolRetrofitInstance2")
lateinit var retforit: Retforit
10
задан Martin OConnor 20 November 2008 в 11:41
поделиться

4 ответа

Используйте класс URI следующим образом:

URI uri = new URI("http", "//www.someurl.com/has spaces in url", null);
URL url = uri.toURL();

или если Вы хотите Строку:

String urlString = uri.toASCIIString();
12
ответ дан 4 December 2019 в 00:27
поделиться

javadocs рекомендуют использовать java.net. Класс URI для выполнения кодирования. Чтобы гарантировать, что класс URI правильно кодирует URL, один из конструкторов мультиаргумента должен использоваться. Эти конструкторы выполнят необходимое кодирование, но потребуют, чтобы Вы проанализировали любую строку URL в параметры.

Если Вы хотите декодировать, необходимо создать URI с конструктором отдельного аргумента, который не делает никакого кодирования. Можно затем назвать методы, такие как getPath () и т.д., чтобы получить и создать декодируемый URL.

1
ответ дан 4 December 2019 в 00:27
поделиться

Ваших составных частей, потенциально содержащих символы, которых нужно оставить, нужно было уже оставить с помощью URLEncoder прежде чем быть связанным в URI.

Если у Вас есть URI с внеполосными символами в (как пространство, "<> [] {}\\| ^ ', и байты неASCII), это не действительно URI. Можно попытаться согласовать их вручную % - выход из них, но это - последняя операция фиксации и не стандартная форма кодирования. Это обычно необходимо, когда Вы принимаете потенциально уродливый URIs от ввода данных пользователем, но это не стандартизированная операция, и я не знаю ни о какой встроенной библиотечной функции Java, которая сделает это для Вас; Вам, вероятно, придется взломать что-то самим с RegExp.

В другом направлении необходимо демонтировать URI в его составные части (каждая часть отдельного тракта, имя параметра запроса и значение, и так далее), прежде чем можно будет не выйти из каждой части (использующий URLDecoder). Нет никакого разумного пути к % - декодируют целый URI сразу; Вы могли попытаться ‘декодировать % - Escape, которые не декодируют к разделителям (как/? = и; %), но Вас оставили бы со странной непоследовательной строкой, которая не соответствует никакому обрабатывающему URI стандарту.

URLEncoder/URLDecoder хорошо для обработки компонентов запроса URI, и имена и значения. Однако они не совсем правы для обработки компонентов части пути URI. Различие - то, что ‘+’ символ не означает пространство в части пути. Можно согласовать это с заменой простой строки: после URLEncoding, замена ‘+’ с ‘%20’; перед URLDecoding, замена ‘+’ с ‘%2B’. Можно проигнорировать различие, если Вы не планируете включать сегменты, содержащие пробелы или плюсы в Вашем пути.

2
ответ дан 4 December 2019 в 00:27
поделиться

Используйте java.net. URLEncoder и java.net. URLDecoder.

-3
ответ дан 4 December 2019 в 00:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: