Utilisation de l’API Graph – Android

Le SDK Android prend en charge l’intégration avec l’API Graph de Facebook. Avec les classes GraphRequest et GraphResponse, vous pouvez envoyer des requêtes et obtenir des réponses au format JSON de façon asynchrone. Vous pouvez également envoyer des requêtes par lot avec une boucle unique vers les serveurs Facebook à l’aide de GraphRequestBatch.

Apprenez-en davantage sur l’API Graph dans :

Consultez également les références concernant GraphRequest, GraphResponse et GraphRequestBatch pour découvrir comment utiliser le SDK Facebook pour Android et pour appeler l’API Graph dans d’autres situations.

Conditions requises

Avant de commencer, configurez :

Classe GraphRequest

La classe GraphRequest présente une méthode newMeRequest qui appelle le point de terminaison /utilisateur/moi pour récupérer les données de l’utilisateur pour le token d’accès donné.

Le SDK Android envoie toutes les autorisations de votre app dans access_token et l’accès aux données est ainsi contrôlé. Si votre app n’a pas de token d’accès disponible, l’API Graph renvoie uniquement les informations accessibles au grand public. Pour plus de détails sur les propriétés et les autorisations de User, consultez Référence concernant l’API Graph, User.

Par défaut, une méthode newMeRequest récupère les champs par défaut depuis un objet utilisateur. Si vous avez besoin de champs supplémentaires ou si vous souhaitez réduire la charge utile des réponses pour des raisons de performance, vous pouvez ajouter un paramètre fields et demander des champs particuliers :

GraphRequest request = GraphRequest.newMeRequest(
        accessToken,
        new GraphRequest.GraphJSONObjectCallback() {
            @Override
            public void onCompleted(
                   JSONObject object,
                   GraphResponse response) {
                // Application code
            }
        });
Bundle parameters = new Bundle();
parameters.putString("fields", "id,name,link");
request.setParameters(parameters);
request.executeAsync();

Dans la méthode de rappel, les données de réponse sont désérialisées en JSONObject lorsque la demande a bien été envoyée. Les champs qui ne peuvent pas être récupérés en raison d’autorisations manquantes ne figureront pas dans le résultat.

Pour l’utilisateur connecté, le SDK a des classes Profile et ProfileTracker. Consultez Facebook Login pour Android.

Récupération des données de l’utilisateur

Les données auxquelles vous accédez dépendent des autorisations qu’une personne accorde à votre app et aux données qu’elle choisit de partager avec les apps. Voici un exemple de réponse brute de l’API Graph pour user_location et user_birthday :

{
  "id": "12345678", 
  "birthday": "1/1/1950", 
  "first_name": "Chris", 
  "gender": "male", 
  "last_name": "Colm", 
  "link": "http://www.facebook.com/12345678", 
  "location": {
    "id": "110843418940484", 
    "name": "Seattle, Washington"
  }, 
  "locale": "en_US", 
  "name": "Chris Colm", 
  "timezone": -8, 
  "updated_time": "2010-01-01T16:40:43+0000", 
  "verified": true
}

Gestion des résultats

En fonction du point de terminaison que vous appelez, vous recevez soit JSONObject, soit JSONArray.

Les appels d’objet unique, tels que newMeRequest, renvoient JSONObject. Les appels pour plusieurs résultats, tels que newMyFriendsRequest, renvoient JSONArray.

Gestion des erreurs

Vous pouvez vérifier le champ d’erreur sur un objet GraphResponse pour voir si une requête a échoué ou non. Le champ d’erreur est de type FacebookRequestError. Les méthodes que vous pouvez appeler sont :

L’objet d’erreur possède des champs qui expliquent les détails de l’erreur, notamment :

  • error code ;
  • sub error code ;
  • error message ;
  • user facing error message ;
  • et d’autres messages.

Pour plus de détails sur les codes d’erreur possibles, consultez Utilisation de l’API Graph, Gestion des erreurs.

L’objet GraphResponse possède également enum, qui catégorise les erreurs. Les trois catégories possibles sont :

  • LOGIN_RECOVERABLE : un problème nécessite que l’utilisateur se connecte à nouveau. Vous pouvez appeler LoginManager de resolveError avec l’objet GraphResponse et l’activité ou le fragment depuis votre app. Cela déclenche l’interface utilisateur Facebook Login et vous devez implémenter CallbackManager par le fragment ou l’activité d’appel pour que la connexion aboutisse.
  • TRANSIENT : indique qu’un problème temporaire est survenu et que votre app peut essayer d’envoyer à nouveau la requête.
  • OTHER : indique qu’un problème général est survenu. Vous pouvez obtenir plus de détails en vérifiant error code et sub error code.

Dépannage

Si vous rencontrez des problèmes pour récupérer les données de l’utilisateur, activez la consignation des requêtes HTTP en ajoutant ce code avant que votre app ne demande les données de l’utilisateur :

FacebookSdk.addLoggingBehavior(LoggingBehavior.REQUESTS);

Cela permettra de consigner les détails de vos requêtes et réponse HTTP dans le journal de la console.

Requêtes par lot

Nous vous conseillons d’envoyer des requêtes par lot pour les données si votre app gère les types de scénarios suivants :

  • accès à de grandes quantités de données dans une seule requête ou
  • changements apportés à plusieurs objets à la fois.

Si vous souhaitez réduire la quantité des boucles vers le serveur, vous pouvez utiliser une requête par lot. Par exemple, nous récupérons un utilisateur et ses amis :

GraphRequestBatch batch = new GraphRequestBatch(
        GraphRequest.newMeRequest(
                access_token,
                new GraphRequest.GraphJSONObjectCallback() {
                    @Override
                    public void onCompleted(
                            JSONObject jsonObject,
                            GraphResponse response) {
                        // Application code for user
                    }
                }),
        GraphRequest.newMyFriendsRequest(
                access_token,
                new GraphRequest.GraphJSONArrayCallback() {
                    @Override
                    public void onCompleted(
                            JSONArray jsonArray, 
                            GraphResponse response) {
                        // Application code for users friends 
                    }
                })
);
batch.addCallback(new GraphRequestBatch.Callback() {
    @Override
    public void onBatchCompleted(GraphRequestBatch graphRequests) {
        // Application code for when the batch finishes
    }
});
batch.executeAsync();

L’exemple ci-dessus montre la requête par lot en tant qu’appel asynchrone. Si ce code se trouve sur un thread d’arrière-plan et que vous souhaitez le bloquer jusqu’à ce que l’appel se termine, vous pouvez appeler batch.executeAndWait().

Ressources connexes