11
votes

Android - Erreur Volley Aucun défi d'authentification trouvé

J'essaie de travailler avec un code hérité et je suis venu contre une question lors de l'utilisation de Volley.

J'essaie d'arriver à une API que notre site principal a et ça fonctionne bien pour un compte, mais pas un autre. J'essaie de résoudre ce que les différences pourraient figurer dans l'URL / en-têtes de la demande ainsi que ce qui revient dans la réponse, mais je n'arrive pas à trouver un moyen de trouver un moyen dans le code de volley pour l'imprimer au journal. < / p>

L'erreur que je reçois est xxx

J'ai lu autour de ce que cela pourrait être dû à une réponse 401, mais je ne sais pas vraiment ce que cela signifie ou au moins comment prouver / tester cela. Je suis vraiment confus que cela fonctionne pour un compte et non un autre.

L'URL est légèrement différente, car on est destiné à notre site britannique et à l'autre Notre AM, mais autrement qu'il n'y a pas de différence.

merci


7 commentaires

C'est une erreur indiquant qu'aucune connexion n'a pu être établie lors de la réalisation d'une demande de volley.


@Raghunandan Savez-vous s'il y a de toute façon obtenir plus d'informations que cela? Toute réponse de réponse, etc.?


Aucune connexion n'a pu être établie. S'il n'y a pas de connexion où est la chance d'obtenir une réponse


@Balazs Je ne pense pas que cela aide, j'ai déjà lu cela. Je ne pense pas que la volley est liée.


@Raghunandan Qu'est-ce qui vous fait penser qu'aucune connexion ne pourrait être établie? Je pensais que c'était quand l'authentification ne correspondait pas


@Russwheeler Vérifiez la source @suppresswarnings ("Serial") Classe publique NoconnectionError extends NetworkError {Public NoconnectionRror () {Super (); } NoconnectionRorror public (raison lancinable) {super (raison); }} et il y a un commentaire disant / ** * erreur indiquant qu'aucune connexion n'a pu être établie lors de la réalisation d'une demande de volley. * /


Cela n'a rien à voir avec la connexion réseau, une erreur a été une erreur de lecture d'un en-tête dans la réponse lorsque 401 a été donnée. Voir ici: Stackoverflow.com/Questtions/12931791/...


5 Réponses :


8
votes

Cette erreur se produit car le serveur envoie un 401 (non autorisé) mais ne donne pas de "authentification www" qui est un indice pour le client quoi faire ensuite. L'en-tête "www-auttricat" indique au client quel type d'authentification est nécessaire ( Basic ou Digest ). Ceci n'est généralement pas très utile dans les clients HTTP sans tête, mais c'est la manière dont la norme est définie. L'erreur se produit parce que la LIF tente d'analyser l'en-tête "www-authentifier" mais ne peut pas.

solutions possibles si vous pouvez changer le serveur: p>

  • Ajoutez un faux "www-authentifier" en-tête comme: www-authentifier: Basic Realm = "faux" code>. Il s'agit d'une solution de contournement non pas une solution, mais elle devrait fonctionner et le client HTTP est satisfait. LI>
  • Utilisez le code d'état HTTP 403 code> au lieu de 401 code>. C'est sémantique n'est pas identique et généralement lorsque vous travaillez avec Login 401 est une réponse correcte ( Voyez ici pour une discussion détaillée ) mais c'est assez proche. Li> ul>

    solutions possibles Si vous ne pouvez pas changer le serveur: p>

    comme @erikz a écrit dans son POST Vous pouvez utiliser un essai et capture P>

    HttpURLConnection connection = ...;
    try {
        // Will throw IOException if server responds with 401.
        connection.getResponseCode(); 
    } catch (IOException e) {
        // Will return 401, because now connection has the correct internal state.
        int responsecode = connection.getResponseCode(); 
    }
    


5 commentaires

J'essaie d'envoyer une en-tête avec une authentification Digest, mais je ne peux pas comprendre comment le faire (toujours à la recherche d'une réponse). Avez-vous un échantillon sur la façon de faire une authentification Digest (ou même de base) dans Android-Volley?


Basic et Digest ne font que mettre un en-tête qui ressemble à cette "autorisation: basique qwxhzgrpbjpvcgvuihnlc2ftzq ==" en basique et plus compliqué à Digest - ce n'est pas spécial pour Volley, vous venez de mettre des en-têtes définis (Google sur la façon de faire cela en volley)


Je suis désolé de poser cette question il y a si longtemps, je ne me souviens même pas de ce qu'il a concerné, plus que le projet hérité a été arrêté. Je vais uplifier votre réponse pour des efforts que vous avez mis, mais je n'ai aucun moyen de vérifier que cela a raison, alors ne le choisirez pas comme la réponse que j'ai peur.


Assez juste. Malade le laisser car cela m'a pris assez longtemps pour comprendre le problème - l'apprentissage de la spécification de repos / http n'est pas parfois aussi simple que vous le pensez :)


Comment ajouter l'en-tête www-authentifier dans la réponse du serveur



8
votes

En effet, j'ai résolu ce problème en incluant le www-authentifier en-tête dans la réponse du serveur.

Toutefois, si vous ajoutez l'en-tête www-authentifier: BASIC REALM = "" et votre API est également consommé par des clients Web, certains navigateurs Web déclencheront une pop-up demandant des informations d'identification de base. < / p>

Pour moi, la bonne solution utilise un schéma personnalisé. Comme expliqué dans ce publication du blog , j'utilise xbasic au lieu de de base dans la réponse de l'en-tête.

www-authentifier: xbasic realm = ""

Avec cet en-tête, non seulement Volley analyse correctement la réponse, mais j'évite également les navigateurs Web montrant l'authentification Pop Up.


4 commentaires

Je suis désolé de poser cette question il y a si longtemps, je ne me souviens même pas de ce qu'il a concerné, plus que le projet hérité a été arrêté. Je vais uplifier votre réponse pour des efforts que vous avez mis, mais je n'ai aucun moyen de vérifier que cela a raison, alors ne le choisirez pas comme la réponse que j'ai peur.


@Russ pas de problème! Je voulais juste aider d'autres personnes à chercher une réponse :)


Juste une note pour l'accompagner. Vous pouvez utiliser n'importe quelle chaîne pour le schéma (par exemple, xbasic comme ci-dessus), mais le realm = "" (y compris les guillemets) doit également être inclus pour éviter que l'exception soit lancée. .


Comment ajouter l'en-tête www-authentifier dans la réponse du serveur



0
votes

J'ai pu attraper ce client lors de l'initialisation du volley requérant: xxx


0 commentaires

0
votes

Si le serveur s'est écrasé, vous pouvez faire face à ce problème. Étapes:

  1. Arrêtez le serveur Tomcat

  2. goto exécuté -> Services -> Redémarrez votre base de données (Ex: Postgres)

  3. Démarrez le serveur Tomcat.


0 commentaires

0
votes

Vous pouvez vérifier E est l'instance de AuthfailUREError.

Log.e(TAG, "AuthFailureError: " + (e instanceof AuthFailureError));


0 commentaires