2015-12-07 1 views
1

Je cours dans un problème de routage des appels réseau en utilisant OkHttp. J'essaie d'envoyer des requêtes HTTP à un périphérique local (via l'adresse IP de l'appareil) en utilisant un point d'accès qui n'a pas d'accès Internet. En raison de certains changements dans Android 5.0, OkHttp va essayer de router la demande sur les données à la place, qui échoue ensuite.Android Lollipop Network API et OkHttp

Dans l'API réseau d'Android 5.0, je pourrais utiliser la classe NetworkCapabilities avec le NetworkRequest.Builder afin de dire à la demande de ne passer que par Wi-Fi. Cependant, j'utilise déjà OkHttp et je ne veux pas pour refondre mon code. Est-il possible de faire une chose similaire avec OkHttp?

Répondre

0

Nous aimerions éventuellement inclure une telle fonctionnalité directement dans OkHttp, et vous pourriez être le premier volontaire/victime à tester les choses. Ce que vous voulez probablement faire est d'utiliser la nouvelle interface Dns d'OkHttp 2.6 pour appeler au réseau de votre choix. Si cela fonctionne, soit l'adresse IP fera OkHttp de faire la bonne chose de toute façon, ou vous devrez également besoin de remplacer le SocketFactory.

+0

Je ne sais pas comment j'utiliser la 'l'interface Dns' pour appeler à travers le réseau de mon choix, pourriez-vous me donner un exemple de utilise le? –

+0

Implémentez l'interface et implémentez lookup() pour appeler getAllByName(). –

+0

Désolé pour la réponse tardive, j'ai eu affaire à d'autres bugs sur l'application sur laquelle je travaille. Comme clarification, le nom d'hôte que je passe à 'OkHttpClient' est juste l'IP de l'appareil. Quand j'appelle getAllByName(), il retourne seulement un 'InetAddress'. Utiliser cette adresse seule n'a pas réglé le problème. Si je remplace le 'SocketFactory' je voudrais juste implémenter les méthodes pour créer un socket qui se connecte directement à l'ip, non? En quoi cela est-il différent du comportement par défaut d'OkHttp? –

1

je suis venu avec une solution de contournement:

final Network currentNetwork = (Network) network; 
newClientBuilder.socketFactory(((Network)network).getSocketFactory()) 
    .dns(new Dns() { 
      @Override 
      public List<InetAddress> lookup(String hostname) throws UnknownHostException { 
         return Arrays.asList(currentNetwork.getAllByName(hostname)); 
        } 
       });