그래프 API 사용 - Android

Android SDK는 Facebook 그래프 API와의 통합을 지원합니다. GraphRequestGraphResponse 클래스를 사용하여 비동기식으로 JSON에서 요청을 보내고 응답을 받을 수 있습니다. GraphRequestBatch를 사용하면 Facebook 서버로의 라운드트립 한 번으로 여러 작업을 일괄 요청할 수도 있습니다.

그래프 API에 대한 자세한 내용은 다음을 참조하세요.

Android용 Facebook SDK를 사용하고 그래프 API를 호출하는 추가 이용 사례를 알아보려면 GraphRequest, GraphResponseGraphRequestBatch 참조도 확인하세요.

전제 조건

시작하기 전에 다음을 설정하세요.

GraphRequest 클래스

GraphRequest 클래스에는 /user/me 엔드포인트를 호출하여 지정된 액세스 토큰의 사용자 데이터를 가져오는 newMeRequest 메서드가 있습니다.

Android SDK에서는 access_token에 지정된 앱의 모든 권한을 전송하고 이를 통해 데이터 액세스를 관리합니다. 앱에 사용 가능한 액세스 토큰이 없는 경우 그래프 API는 공개적으로 사용 가능한 정보만 반환합니다. User 특성 및 권한에 대한 자세한 내용은 그래프 API 참조의 User 섹션을 참조하세요.

기본적으로 newMeRequest 메서드를 통해 사용자 개체에서 기본 필드를 가져옵니다. 추가 필드가 필요하거나 성능상의 이유로 응답 페이로드를 줄이고 싶은 경우 다음과 같이 fields 매개변수를 추가하여 특정 필드를 요청할 수 있습니다.

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();

콜백 메서드에서, 요청이 성공하면 응답 데이터가 JSONObject로 역직렬화됩니다. 권한이 없어서 가져올 수 없는 필드는 결과에서 생략됩니다.

로그인한 사용자의 경우 SDK에 ProfileProfileTracker 클래스가 있으며 Android용 Facebook 로그인을 참조하세요.

사용자 데이터 가져오기

액세스하는 데이터는 사용자가 앱에 부여한 권한 및 앱과 공유하도록 선택한 데이터에 따라 다릅니다. 다음은 user_locationuser_birthday의 그래프 API 원본 응답의 예제입니다.

{
  "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
}

결과 처리

호출하는 엔드포인트에 따라 JSONObject 또는 JSONArray가 수신됩니다.

newMeRequest 같은 단일 개체 호출은 JSONObject를 반환합니다. newMyFriendsRequest와 같이 여러 결과를 호출하면 JSONArray가 반환됩니다.

오류 처리

GraphResponse 개체의 오류 필드를 검사하여 요청 실패 여부를 확인할 수 있습니다. 오류 필드는 FacebookRequestError 유형입니다. 호출할 수 있는 메서드는 다음과 같습니다.

오류 개체에는 오류에 대한 상세 정보를 설명하는 다음과 같은 필드가 있습니다.

  • error code,
  • sub error code
  • error message
  • user facing error message
  • 기타 메시지

가능한 오류 코드에 대한 자세한 내용은 그래프 API 사용의 오류 처리를 참조하세요.

GraphResponse 개체에는 오류를 분류하는 enum도 있습니다. 오류는 다음과 같이 세 가지로 분류할 수 있습니다.

  • LOGIN_RECOVERABLE - 사용자가 다시 로그인해야 하는 문제가 있습니다. 앱에서 GraphResponse 개체 및 액티비티 또는 프래그먼트를 사용하여 LoginManagerresolveError를 호출할 수 있습니다. 그러면 Facebook 로그인 UI가 트리거되며, 로그인에 성공하도록 프래그먼트나 액티비티를 호출하여 CallbackManager를 구현해야 합니다.
  • TRANSIENT - 일시적인 문제가 발생했음을 나타내며, 앱에서 요청을 재시도할 수 있습니다.
  • OTHER - 일반적인 문제가 발생했음을 나타내며, error codesub error code를 검사하여 자세한 내용을 확인할 수 있습니다.

문제 해결

사용자 데이터를 가져오는 데 문제가 있으면, 앱에서 사용자 데이터를 요청하기 전에 이 코드를 추가하여 HTTP 요청 로깅을 활성화하세요.

FacebookSdk.addLoggingBehavior(LoggingBehavior.REQUESTS);

그러면 HTTP 요청 및 응답에 대한 상세 정보를 콘솔 로그에 로깅합니다.

일괄 처리 요청

앱에서 다음과 같은 유형의 시나리오를 처리하는 경우 데이터를 일괄 처리를 요청해야 합니다.

  • 한 번의 요청으로 상당한 양의 데이터에 액세스
  • 여러 개체를 한 번에 변경

서버 라운드트립의 양을 줄이려면 일괄 처리 요청을 사용할 수 있습니다. 예를 들어, 사용자와 친구를 가져옵니다.

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();

위의 예에서는 일괄 처리 요청을 비동기식 호출로 표시합니다. 코드가 백그라운드 스레드에 있으며 호출이 완료될 때까지 이 스레드를 차단하려면 batch.executeAndWait()를 호출할 수 있습니다.

관련 리소스