Hướng dẫn sử dụng Restfb - Java API cho Facebook
Công ty Vĩnh Cửu tuyển dụng lập trình viên Java

1- Restfb là gì?

Trước hết Facebook coi các mối quan giữa các thực thể như là một "Đồ thị xã hội" (Social Graph). Và họ xây dựng ra một API, gọi là "Facebook Graph API", API này cho phép lấy ra thông tin, sửa đổi thông tin của các thực thể, chẳng hạn như upload ảnh, viết comment, lấy ra danh sách bạn bè,... API này cơ sở trên HTTP như vậy nó cho phép bất cứ một ngôn ngữ nào có thư viện HTTP đều có thể làm việc với nó, trong đó có Java.
Restfb là một Java API cho phép bạn tương tác với Facebook Graph API.
Chúng ta cần phải đảm bảo rằng bạn đã biết về "Facebook Graph API" trước khi bắt đầu đọc tài liệu này. Bạn có thể tham khảo tài liệu hướng dẫn khám phá "Facebook Graph API" tại:

2- Restfb download

Nếu bạn sử dụng Maven:
<!-- http://mvnrepository.com/artifact/com.restfb/restfb -->

<dependency>
    <groupId>com.restfb</groupId>
    <artifactId>restfb</artifactId>
    <version>1.16.0</version>
</dependency>

3- Tạo project

Copy ACCESS_TOKEN bạn thấy trên "Facebook Graph Explorer" vào trường MY_ACCESS_TOKEN của class Constants dưới đây.

Chú ý: ACCESS_TOKEN trên "Facebook Graph Explorer" không tồn tại lâu, nó sẽ hết hạn trong khoảng thời gian nào đó, khi đó bạn cần phải copy lại. Trong ứng dụng bạn có thể lấy giá trị Access_Token một cách động tại thời điểm runtime. Vấn đề này cũng sẽ được hướng dẫn trong tài liệu này.

  • Constants.java
package org.o7planning.tutorial.restfb;

public class Constants {

   public static final String REDIRECT_URI
                 = "http://localhost:8080/facebookfriends/FriendsListServlet";

   
   public static final String MY_ACCESS_TOKEN = "<Your Access Token>";

   // Facebook App
   public static final String MY_APP_ID = "<your app id>";
   public static final String MY_APP_SECRET = "<your app secret>";

}
Bạn nên sử dụng một Access Token với nhiều quyền truy cập dữ liệu. Trên Facebook Graph Explorer nhấn vào "Get Token/Get User Access Token". Và chọn các quyền, sau đó nhấn "Get Access Token" để có được một Access Token mới với nhiều quyền hạn hơn.

4- Bắt đầu

Để bắt đầu truy cập dữ liệu Facebook bạn cần phải có đối tượng FacebookClient. Dưới đây là các cách tạo đối tượng này.
// DefaultFacebookClient là class triển khai của interface FacebookClient
// Với RestFB. Bạn có thể tùy biến nó bằng cách truyền các đối tượng tùy biến
// JsonMapper và WebRequestor, hoặc đơn giản là viết một class
// của bạn thi hành interface FacebookClient để có thể điều khiển công việc tối đa.

FacebookClient facebookClient = new DefaultFacebookClient(MY_ACCESS_TOKEN);

// Bạn cũng có thể tạo một đối tượng  truy cập các dữ liệu công khai
// - và không cần truyền vào ACCESS_TOKEN
// Chú ý: Trong tài liệu này có nhiều ví dụ bắt buộc cần ACCESS_TOKEN.

FacebookClient publicOnlyFacebookClient = new DefaultFacebookClient();

// Với các ứng dụng FacebookApp:

FacebookClient facebookClient
            = new DefaultFacebookClient(MY_APP_ACCESS_TOKEN, MY_APP_SECRET);

4.1- Ví dụ lấy thông tin của bạn

  • SimpleMeExample.java
package org.o7planning.tutorial.restfb.me;

import org.o7planning.tutorial.restfb.Constants;

import com.restfb.DefaultFacebookClient;
import com.restfb.FacebookClient;
import com.restfb.types.User;

public class SimpleMeExample {

    public static void main(String[] args) {
        
        // Tạo đối tượng FacebookClient
        FacebookClient facebookClient= new DefaultFacebookClient(Constants.MY_ACCESS_TOKEN);
        
        // User là một class có sẵn của Restfb mô tả các thông tin của User
        // Trong tình huống này chúng ta biết trước dữ liệu trả về là User.
        User user = facebookClient.fetchObject("me", User.class);
        
        System.out.println("User="+ user);
        System.out.println("UserName= "+ user.getUsername());
        System.out.println("Birthday= "+ user.getBirthday());

    }

}
Kết quả chạy ví dụ:

4.2- Tùy biến thông tin của bạn

  • CustomUser.java
package org.o7planning.tutorial.restfb.me;

import com.restfb.Facebook;

public class CustomUser {

    @Facebook("first_name")
    private String firstName;

    @Facebook("last_name")
    private String lastName;

    @Facebook("name")
    private String fullName;

    @Facebook
    private String email;

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String getFullName() {
        return fullName;
    }

    public void setFullName(String fullName) {
        this.fullName = fullName;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

}
  • CustomDataMeExample.java
package org.o7planning.tutorial.restfb.me;

import org.o7planning.tutorial.restfb.Constants;

import com.restfb.DefaultFacebookClient;
import com.restfb.FacebookClient;
import com.restfb.Parameter;

public class CustomDataMeExample {

   public static void main(String[] args) {
   
       FacebookClient facebookClient = new DefaultFacebookClient(
               Constants.MY_ACCESS_TOKEN);

       CustomUser user = facebookClient.fetchObject("me", CustomUser.class,
               Parameter.with("fields",
                       "id, name, email, first_name, last_name"));

       System.out.println("First Name= " + user.getFirstName());
       System.out.println("Last Name= " + user.getLastName());
       System.out.println("Full Name= " + user.getFullName());
       System.out.println("Email= " + user.getEmail());
   }
}
Kết quả chạy ví dụ:

4.3- Kiểu dữ liệu JsonObject

Restfb xây dựng một số class mô tả cho các dữ liệu, chẳng hạn User, Album, .. trong thực tế bạn cần nhiều hơn như thế. Trong tình huống tổng quát nó là JsonObject. Ví dụ một dữ liệu Json đơn giản dưới đây:
{
 "id": "687563464611117",
 "email": "abc@yahoo.com",
 "birthday": "04/11/2000",
 "albums": {
   "data": [
     {
       "name": "Test Album",
       "type": "normal",
       "id": "726713597396700",
       "created_time": "2014-09-01T08:11:52+0000"
     },
     {
       "name": "Untitled Album",
       "type": "normal",
       "id": "726695580731835",
       "created_time": "2014-09-01T06:55:23+0000"
     }
   ]
 }
}
  • JsonUserDataExample.java
package org.o7planning.tutorial.restfb.me;

import org.o7planning.tutorial.restfb.Constants;

import com.restfb.DefaultFacebookClient;
import com.restfb.FacebookClient;
import com.restfb.Parameter;
import com.restfb.json.JsonObject;

public class JsonUserDataExample {

    public static void main(String[] args) {

        FacebookClient facebookClient = new DefaultFacebookClient(
                Constants.MY_ACCESS_TOKEN);

        //
        // Trong tình huống tổng quát, sử dụng JsonObject.
        //
        JsonObject userData = facebookClient.fetchObject("me",
                JsonObject.class, Parameter.with("fields", "name, first_name"));

        System.out.println("userData=" + userData);

        System.out.println("FirstName=" + userData.getString("first_name"));
        System.out.println("Name= " + userData.getString("name"));
    }
}
Kết quả chạy ví dụ:

4.4- Connection

Connection (Kết nối) - Là liên hệ giữa các "thứ" trong mạng xã hội facebook, chẳng hạn liên hệ của  bức ảnh và các ghi chú của bức ảnh, liên hệ giữa người dùng và các người bạn. Đôi khi còn gọi là Edge (Cạnh).
Xem trên "Facebook Graph Explorer":

4.5- Ví dụ với Albums

  • AlbumsExample.java
package org.o7planning.tutorial.restfb.connection;

import java.util.List;

import org.o7planning.tutorial.restfb.Constants;

import com.restfb.Connection;
import com.restfb.DefaultFacebookClient;
import com.restfb.FacebookClient;
import com.restfb.types.Album;

public class GetAlbumsExample {

   public static void main(String[] args) {
       FacebookClient facebookClient = new DefaultFacebookClient(
               Constants.MY_ACCESS_TOKEN);

       Connection<Album> albumConnection = facebookClient.fetchConnection(
               "me/albums", Album.class);
       List<Album> albums = albumConnection.getData();

       for (Album album : albums) {
           System.out.println("Album name:" + album.getName());
       }

   }
}
Kết quả chạy ví dụ:

4.6- Ví dụ với Album và tham số

  • CustomGetAlbumsExample.java
package org.o7planning.tutorial.restfb.connection;

import java.util.Date;
import java.util.List;

import org.o7planning.tutorial.restfb.Constants;

import com.restfb.Connection;
import com.restfb.DefaultFacebookClient;
import com.restfb.FacebookClient;
import com.restfb.Parameter;
import com.restfb.types.Album;

public class CustomGetAlbumsExample {
    
    
    public static void main(String[] args) {
        FacebookClient facebookClient = new DefaultFacebookClient(
                Constants.MY_ACCESS_TOKEN);

        // 1 tuần trước.
        Date oneWeekAgo = new Date(System.currentTimeMillis() - 1000L * 60L
                * 60L * 24L * 7L);

        // Lấy ra kết nối tới các Album tạo trong khoảng 1 tuần trước.
        // Và tối đa 3 Album.
        Connection<Album> albumConnection = facebookClient.fetchConnection(
                "me/albums", Album.class, Parameter.with("limit", 3),                
                Parameter.with("since", oneWeekAgo));
        List<Album> albums = albumConnection.getData();

        for (Album album : albums) {
            System.out.println("Album name:" + album.getName());
        }

    }
}
Và kết quả: