잡동사니

페이스북 RestAPI 구조 분석 본문

IT

페이스북 RestAPI 구조 분석

yeTi 2019. 9. 11. 11:33

RestAPI를 사용하는 회사중 유명한 페이스북의 RestAPI의 구조를 확인해보려고 합니다.
페이스북 개발자 페이지에서 API를 확인하고 API 탐색기로 요청해봤습니다.

공통 특성

  • Access token을 Request param으로 받음

API의 구조는 다음과 같음

  • GET /[버전]/[Node]/[Edge]
  • GET /[버전]/[Object id]/feed
  • 예)
    curl -i -X GET \ "https://graph.facebook.com/v4.0/{canvas-id}
      ?access_token=your-access-token" HTTP/1.1

Object id의 종류를 다양하게 받음

Feed

curl -i -X GET \ "https://graph.facebook.com/v4.0/{your-user-id}/feed
    ?access_token=your-access-token" HTTP/1.1

Friends

curl -i -X GET \ "https://graph.facebook.com/v4.0/{your-user-id}/friends
    ?access_token=your-access-token" HTTP/1.1

Canvas

curl -i -X GET \ "https://graph.facebook.com/v4.0/{canvas-id}
    ?access_token=your-access-token" HTTP/1.1

Album

curl -i -X GET \ "https://graph.facebook.com/v4.0/{album-id}
    ?access_token=your-access-token" HTTP/1.1

...

동일한 URI 형식에 다양한 Object id를 사용하면 서비스 구분은 어떻게 하나?

예) URI의 요청이 Canvas인지 Album인지 어떻게 판단하나?
내가 URI를 만들었다면 다음과 같이 만들었을 것이다.

Canvas

curl -i -X GET \ "https://graph.facebook.com/v4.0/canvas/{canvas-id}
    ?access_token=your-access-token" HTTP/1.1

Album

curl -i -X GET \ "https://graph.facebook.com/v4.0/album/{album-id}
    ?access_token=your-access-token" HTTP/1.1

페이스북은 피드 데이터를 그래프 DB를 활용하여 데이터를 구성하는걸로 알고 있는데 그 부분이 API 구조에 영향을 미친것은 아닌가하는 의구심이 든다.

Field를 선택할 수 있음

curl -i -X GET \ "https://graph.facebook.com/{your-user-id}
    ?fields=birthday,email,hometown
    &access_token={your-user-access-token}" HTTP/1.1

페이징 제공

페이징을 하고 싶은 수를 요청하면 이전/이후 데이터를 URI로 제공

요청

curl -i -X GET \ "https://graph.facebook.com/{your-user-id}
    ?fields=feed.limit(3)
    &access_token={your-access-token}" HTTP/1.1

응답 (시간 기반)

{
  "feed": {
    "data": [
      {
        "created_time": "2017-12-12T01:24:21+0000",
        "message": "This picture of my grandson with Santa",
        "id": "{your-user-id}_1809387339093972"       // Post ID
      },
      {
        "created_time": "2017-12-11T23:40:17+0000",
        "message": ":)",
        "id": "{your-user-id}_1809316002434439"       // Post ID
      },
      {
        "created_time": "2017-12-11T23:31:38+0000",
        "message": "Thought you might enjoy this.",
        "id": "{your-user-id}_1809310929101613"       // Post ID
      }
    ],
    "paging": {
      "previous": "https://graph.facebook.com/v3.2/{your-user-id}/feed?format=json&limit=3&since=1542820440&access_token={your-user-access-token}&__paging_token=enc_AdCgj6RSGWTYV7EXj2cFlOWJjbZCq8oI3ogIpLrxPCVK3U8Kad0EgsZA2vri3YKIwl71XGRDJz9C8TgqMeyiu8U5CD&__previous=1",
      "next": "https://graph.facebook.com/v3.2/{your-user-id}/feed?format=json&limit=3&access_token={your-user-access-token}&until=1542583212&__paging_token=enc_AdDLmzUgWiLo6oHGCI53S5begiKOfNZBY0affrLMWgheBzfwMA7XSKmgjyNbuZBIptdXc18j1Se0Dm7vEsePh1SoM3"
    }
  },
  "id": "{your-user-id}"
}

응답 (커서 기반)

{
  "data": [
     ... Endpoint data is here
  ],
  "paging": {
    "cursors": {
      "after": "MTAxNTExOTQ1MjAwNzI5NDE=",
      "before": "NDMyNzQyODI3OTQw"
    },
    "previous": "https://graph.facebook.com/{your-user-id}/albums?limit=25&before=NDMyNzQyODI3OTQw"
    "next": "https://graph.facebook.com/{your-user-id}/albums?limit=25&after=MTAxNTExOTQ1MjAwNzI5NDE="
  }
}

응답 (오프셋 기반)

{
  "data": [
     ... Endpoint data is here
  ],
  "paging": {
    "previous": "https://graph.facebook.com/{your-user-id}/feed?limit=25&offset=76",
    "next": "https://graph.facebook.com/{your-user-id}/feed?limit=25&offset=126"
  }
}

응답 데이터 형식

Post

{
  "id": "{your-page-id}_1810399758992730"      // Post ID
}

Put

{
  "success": true
}

Delete

{
  "success": true
}

오류 처리

오류 결과

{
  "error": {
    "message": "Message describing the error", 
    "type": "OAuthException", 
    "code": 190,
    "error_subcode": 460,
    "error_user_title": "A title",
    "error_user_msg": "A message",
    "fbtrace_id": "EJplcsCHuLu"
  }
}

오류 코드

권한 오류 코드

느낀점

페이스북에서 제공하는 API는 크게 두가지 형태인거 같습니다.

  • 사용자를 기반으로 데이터를 조회
  • 특정 데이터의 상세조회

사용자를 기반으로 데이터 목록을 확인하고 선택한 데이터의 상세 정보를 보기 편한 구조로 API를 제공하는거 같습니다.

Comments