я могу использовать OkHttp для доступа к домашнему серверу как из той же сети, что и сервер, так и из внешней сети? - PullRequest
0 голосов
/ 24 января 2019

Я использую библиотеку Android (SardineAndroid) для доступа к серверу DAV, расположенному на персональном Raspberry Pi, работающем под управлением Linux / Apache2.Pi подключен к моему домашнему маршрутизатору и доступен через публичное доменное имя.

SardineAndroid построен поверх Okttp

Однако я не могу использовать тот же URL для доступа к этому серверу, если яЯ в локальной сети (Wi-Fi) и за ее пределами.Перенаправление домена не может найти IP-адрес сервера, если я нахожусь в сети.Но он работает из локальной сети, если я изменяю URL, заменяя имя домена локальным IP-адресом.

Конечно, больно вручную переключаться с одного URL на другой, в зависимости от того, где я нахожусь (сеть, к которой я подключен), будь то домашний Wi-Fi или другие ситуации.

Можно ли настроить OkHttp для разрешения этого проблемного сценария?

вот мое создание клиента Okttp:

OkHttpClient.Builder builder = new OkHttpClient.Builder();
final Map<String, CachingAuthenticator> authCache = new ConcurrentHashMap<>();

Credentials credentials = new Credentials(DAV_USER_NAME, DAV_PASSWORD);
final BasicAuthenticator basicAuthenticator = new BasicAuthenticator(credentials);
final DigestAuthenticator digestAuthenticator = new DigestAuthenticator(credentials);

// note that all auth schemes should be registered as lowercase!
DispatchingAuthenticator authenticator = new DispatchingAuthenticator.Builder()
        .with("digest", digestAuthenticator)
        .with("basic", basicAuthenticator)
        .build();

OkHttpClient client = builder
        .authenticator(new CachingAuthenticatorDecorator(authenticator, authCache))
        .addInterceptor(new AuthenticationCacheInterceptor(authCache))
            //.addNetworkInterceptor(logger)
        .retryOnConnectionFailure(true)
        .pingInterval(5, TimeUnit.SECONDS)
        .connectTimeout(300, TimeUnit.SECONDS)
        .writeTimeout(300, TimeUnit.SECONDS)
        .readTimeout(300, TimeUnit.SECONDS)

        .build();
...