23
Nov
2010
admin

Graph API vs FQL vs REST API

Als Entwickler stehen uns mehrere Schnittstellen zur Verfügung, über die wir auf Daten, wie z.B. Profilinformationen, zugreifen können. Die Frage, welche dieser Schnittstellen man nutzen soll, hängt im Prinzip von der jeweiligen Anforderung ab. Generell ist jedoch zu sagen, dass Facebook meist die Graph API anderen Schnittstellen vorzieht, da sie der Kern der Facebook Plattform ist.

Nichts desto trotz hat auch die Facebook Query Language (kurz: FQL) durchaus ihre Berechtigung. Die REST API bietet teilweise sogar noch Funktionen, die in die Graph API noch nicht implementiert wurden. Allerdings sollte man beim Erstellen neuer Anwendungen beachten, dass die REST API in naher Zukunft wegfallen wird.

Wie man diese drei Schnittstellen in seiner Anwendung nutzen kann, werden wir uns nun anhand eines simplen Beispiels ansehen. Unsere Anwendung soll uns einige Profil Informationen eines User ausgeben. Dazu werden wir einen Testuser anlegen und dann mit diesem arbeiten.

Hinweis
Wenn Du mehr über das Arbeiten mit Testusern wissen möchtest, findest Du alles, was Du brauchst, im Workshop Anwendungen Testen mit Testusern

Fangen wir mit der Graph API an.

require 'library/facebook.php';

define('APP_ID',      '119632661432164');
define('APP_SECRET' , '26573e26aa356dffec3180c4a16058c2');

$facebook = new Facebook(array(
  'appId'  => APP_ID, // Anwendungs ID
  'secret' => APP_SECRET, // Anwendungs-Geheimcode
  'cookie' => true, // enable optional cookie support
));

try {

  // Alle Testuser abrufen, die für diese Anwendung erstellt wurden.
  $testuser = $facebook->api(APP_ID . "/accounts/test-users", 'get');

  // Wenn noch kein Testuser für diese Anwendung existiert, erstellen wir uns einen.
  if (!isset($testuser['data'][0]['id'])) {
    $facebook->api(APP_ID . "/accounts/test-users?installed=true&permissions=user_about_me", 'post');
  }
  // Wir speichern die User ID und den Access Token des Testusers.
  $testuserId    = $testuser['data'][0]['id'];
  $testuserToken = $testuser['data'][0]['access_token'];

  // Abfrage der Profildaten über die Graph API.
  $graphApi = $facebook->api("/{$testuserId}", array('access_token' => $testuserToken));

  // Ausgabe der Graph API Daten.
  print '<pre>' . print_r($graphApi, true) . '</pre>';

} catch (FacebookApiException $e) {
  print $e;
}

Nachdem wir den Testuser angelegt und seine ID, sowie seinen Access Token gespeichert haben, rufen wir über die Graph API seine Profil Informationen ab. Der Zugriff auf die Graph API erfolgt also hier:

$graphApi = $facebook->api("/{$testuserId}", array('access_token' => $testuserToken));

Schauen wir uns an, welche Daten ausgegeben werden:

Genau die gleichen Informationen wollen wir nun per FQL abfragen. Auch hier benutzen wir unseren Testuser. Es ändert sich lediglich die API Anfrage:

  // Abfrage der Profildaten über FQL.
  $fql = $facebook->api(array(
                        'method'  => 'fql.query',
                        'query'   => "SELECT uid, name, first_name, middle_name, last_name, profile_url, sex, locale 
                                        FROM user
                                        WHERE uid = {$testuserId}",
                        'access_token' => $testuserToken,
                      ));

  // Ausgabe der FQL Daten.
  print '<pre>' . print_r($fql, true) . '</pre>';

Das Resultat:

Zu guter Letzt rufen wir die gleichen Daten noch mal über die REST API ab. Auch hier ändert sich wieder nur der API Aufruf:

  // Abfrage der Profildaten über die REST API.
  $restApi = $facebook->api(array(
                        'method'  => 'users.getInfo',
                        'uids'    => "{$testuserId}",
                        'fields'  => 'uid, first_name, middle_name, last_name, name, locale, profile_url, sex',
                        'access_token' => $testuserToken,
                      ));

  // Ausgabe der REST API Daten.
  print '<pre>' . print_r($restApi, true) . '</pre>';

Auch hier erhalten wir die gleichen Informationen als Antwort:

Auf den ersten Blick erscheinen die REST API und FQL flexibler zu sein, da wir hier genau angeben können, welche Felder wir benötigen. Das geht allerdings auch über die Graph API:

  // Abfrage bestimmter Felder der Profildaten über die Graph API.
  $graphApiFields = $facebook->api("/{$testuserId}?fields=id,first_name,middle_name,last_name,gender,locale,link", array('access_token' => $testuserToken));

  // Ausgabe der Graph API Daten.
  print '<pre>' . print_r($graphApiFields, true) . '</pre>';

Im Großen und Ganzen kann man also sagen, dass sich die verschiedenen Schnittstellen, bis auf die Art und Weise, wie sie aufgerufen werden, nicht großartig voneinander unterscheiden. Das gilt allerdings nur bei relativ einfachen Sachen, wie in diesem Beispiel.

Stellen wir uns mal vor, wir wollen diese Informationen nun nicht nur von dem einen User, sondern auch noch von den Freunden dieses Users haben. Das bedeutet, dass wir die IDs der Freunde ermitteln und anschließend die Informationen pro Freund auslesen müssen. Für dieses Beispiel legen wir uns 5 Testuser an. Testuser Nr.1 lassen wir mit den anderen 4 Testusern Freundschaft schließen. Danach lesen wir die Profil Informationen aller Freunde von Testuser 1 aus (also die Daten von Testuser2 - Testuser5). Damit wir uns hier auf das Wesentliche konzentrieren können, habe ich das Anlegen und Freundschaft schließen der Testuser in ein externes Script verschoben, welches wir hier nur inkludieren werden.

Fangen wir wieder mit der Graph API an:

require 'library/facebook.php';

define('APP_ID',      '119632661432164');
define('APP_SECRET' , '26573e26aa356dffec3180c4a16058c2');

$facebook = new Facebook(array(
  'appId'  => APP_ID, // Anwendungs ID
  'secret' => APP_SECRET, // Anwendungs-Geheimcode
  'cookie' => true, // enable optional cookie support
));

try {

  // Hier werden 5 Testuser angelegt und Freunschaft
  // zwischen dem ersten und allen anderen Usern geschlossen.
  include 'inc/createTestusers.php';

  // Wir speichern die ID von User1.
  $userId = $testusers['data'][0]['id'];
  // Wir speichern den Access Token von User1.
  $userAt = $testusers['data'][0]['access_token'];

  // Eine Liste der Freunde abrufen.
  $friends = $facebook->api("/{$userId}/friends", array('access_token' => $userAt));

  // Abfrage der Profildaten über die Graph API.
  for ($i = 0, $friendCount = sizeof($friends['data']); $i < $friendCount; $i++) {
    // Wir gehen die Liste der Freunde durch und speichern die ID der Freunde.
    $friendId = $friends['data'][$i]['id'];
    // Profildaten abrufen über einen API Aufruf.
    $graphApi = $facebook->api("/{$friendId}", array('access_token' => $userAt));
    // Ausgabe der Profildaten.
    print '<pre>' . print_r($graphApi, true) . '</pre>';
  }

} catch (FacebookApiException $e) {
  print $e;
}

Es läuft also genau wie beschrieben. Als fragen wir eine Liste aller Freunde unseres Testusers ab:

$friends = $facebook->api("/{$userId}/friends", array('access_token' => $userAt));

Danach gehen wir diese Liste in einer Schleife durch und fragen die Profildaten der einzelnen Freunde ab und schreiben sie auf den Bildschirm:

  for ($i = 0, $friendCount = sizeof($friends['data']); $i < $friendCount; $i++) {
    // Wir gehen die Liste der Freunde durch und speichern die ID der Freunde.
    $friendId = $friends['data'][$i]['id'];
    // Profildaten abrufen über einen API Aufruf.
    $graphApi = $facebook->api("/{$friendId}", array('access_token' => $userAt));
    // Ausgabe der Profildaten.
    print '<pre>' . print_r($graphApi, true) . '</pre>';
  }

Die Ausgabe ist analog zu der aus dem ersten Graph Beispiel, nur eben, dass es diesmal 4 Arrays sind, statt nur dem einen, deswegen spare ich mir hier den Screenshot.

Als nächstes fragen wir die Daten der Freunde des Testusers über die REST API ab. Hier ändert sich auch wieder nur der Zugriff auf die API:

  // Eine Liste der Freunde abrufen.
  $friends = $facebook->api(array(
                              'method'  => 'friends.get',
                              'uid'    => "{$userId}",
                              'access_token' => $userAt,
                            ));

  foreach ($friends as $friendId) {
    // Abfrage der Profildaten über REST.
    $restApi = $facebook->api(array(
                                'method'  => 'users.getInfo',
                                'uids'    => "{$friendId}",
                                'fields'  => 'uid, first_name, middle_name, last_name, name, locale, profile_url, sex',
                                'access_token' => $userAt,
                              ));

    // Ausgabe der REST Daten.
    print '<pre>' . print_r($restApi, true) . '</pre>';
  }

Gleiches Spiel, gleiche Ausgabe:
Liste der Freunde anfordern, Freunde in einer Schleife durchlaufen, Daten der Freunde auslesen und ausgeben.

Als letztes die Abfrage über die FQL. Ebenfalls wieder nur den geänderten API Aufruf:

  // Abfrage der Profildaten über FQL.
  $fql = $facebook->api(array(
                        'method'  => 'fql.query',
                        'query'   => "SELECT uid, name, first_name, middle_name, last_name, profile_url, sex, locale
                                        FROM user
                                        WHERE uid = {$userId}
                                        OR uid IN (SELECT uid2 FROM friend WHERE uid1 = {$userId})",
                        'access_token' => $userAt,
                      ));

  // Ausgabe der FQL Daten.
  print '<pre>' . print_r($fql, true) . '</pre>';

Die Ausgabe ist wieder die gleiche. Es gibt allerdings einen großen Unterschied zur Abfrage über die Graph API oder die REST API. Wir benötigen nur einen einzigen API Zugriff und nicht, wie bei der Graph API oder der REST API, ganze 5 (einen für die Liste der Freunde und 4 für das Abrufen der Daten, also pro Freund ein Zugriff).

Es lohnt sich also in jedem Fall genau zu überlegen, wann man welche API einsetzt und wo man evtl. Ressourcen und Zeit sparen kann. Schließlich ist man nicht auf eine API beschränkt und kann auch innerhalb einer Anwendung verschiedene APIs für verschieden Aufgaben benutzen.

Hinweis
Du kannst alle Codebeispiele von AboutTheWeb über ein SVN Repository auschecken. Dieses Beispiel findest du unter folgender Adresse:
http://svn.abouttheweb.de/atwtutorials/trunk/graph-fql-rest/

Alternativ kannst Du alle Codebeispiele über das AboutTheWeb github Repository auschecken.

Ähnliche Artikel

Bild des Benutzers Nitro
Nitro
Do, 09/08/2011 - 13:14

Hallo,
erstmal super Artikel!

Ich habe ein Problem ich habe einen Webserver mit Tomcat und Liferay und möchte, wie beschrieben die Befehle ausführen. Wo und wie muss ich die facebook.php hintun oder ansprechen?

kann ich mit Tomcat und liferay die php Befehler überhaupt ausführen?

Über eine Antwort würde ich mich sehr freuen.

Grüße
Nitro

X
Laden