κ°9 API(μ΄ν API)λ κ°9 κΈ°λ₯ λλΆλΆμ μ§μνλ©°, λ³λμ API λλ©μΈμμ REST νμμΌλ‘ μ§μν©λλ€.μ΅μ λ¬Έμ λ΄μ©μ νμ API Github μμ νμΈνμ€ μ μμ΅λλ€.
κ°9μμ μ€μ λ‘ μ 곡νλ λͺ¨λ μ΄λ―Έμ§μλ, μν°λ§ν¬κ° ν¬ν¨λμ΄ μμ΅λλ€. APIλ₯Ό μ¬μ©νλ μ¬μ©μλ, μ΄ μν°λ§ν¬λ₯Ό μμλ‘ μ κ±°ν μ μμΌλ©° μ κ±°νμ¬ μ΄μ©ν κ²½μ° API μ¬μ©μ΄ μ°¨λ¨ λλ λ±μ λΆμ΄μ΅μ λ°μΌμ€ μ μμ΅λλ€.
μ΄μ κ΄λ ¨λ μμΈν λ¬Έμλ [email protected] μΌλ‘ λΆνλ립λλ€.
- λ³Έ λ¬Έμμμ <λ΄μ©> ννλ£ νμλ λΆλΆμ, μ λΉν μλ§μ κ°μΌλ‘ λ³κ²½ν΄ λ£μ΄μΌ νλ μΈμλ₯Ό μλ―Έ ν©λλ€.
APIλ μΈμ¦μ νμλ‘ νλ APIμ μΈμ¦μμ΄ μλλλ APIλ‘ κ΅¬λ³λλ©°, λͺ¨λ μ°κΈ°/μ λ°μ΄νΈ/μμ λ±μ μμ²μλ μΈμ¦μ΄ νμν©λλ€.
κΈ°λ³Έμ μΌλ‘ μΈμ¦μ λ€μκ³Ό κ°μ λ°©μμ μ§μνκ³ μμ΅λλ€.
- OAuth 2.0 Draft 16 μ΄μ
- λΈλΌμ°μ μΈμ μ μ΄μ©ν λ°©λ²
μ£Όμ: λΈλΌμ°μ μΈμ μ μ΄μ©ν λ°©λ²μ κ²½μ°, GAE9νκ³Ό λ³λμ νμκ° νμν©λλ€. μμΈν λ΄μ©μ [email protected] μΌλ‘ λ©μΌ μ£ΌμΈμ.
OAuth μΈμ¦μ OAuth 2.0 Draft 16 μ΄μμ νμ€μ μ€μνλ μ μμ μ§μνλ©°, HTTP Authorization ν΄λλ₯Ό ν΅ν΄, HMAC-SHA1 μΌλ‘ μλͺ λ μλͺ λ§ μλ½νκ³ μμ΅λλ€.
| Endpoint | URL |
|---|---|
| Token Request | http://api.gae9.com/oauth/request_token |
| Authorize | http://api.gae9.com/oauth/authorize |
| Access Token | http://api.gae9.com/oauth/access_token |
OAuth μΈμ¦μ μ¬μ©νλ €λ©΄ GAE9 κ°λ°μ νμ΄μ§ μμ Application λ±λ‘ κ³Όμ μ μνν΄μΌ ν©λλ€.
λͺ¨λ μμ²μ http://api.gae9.com νΈμ€νΈμμ μ²λ¦¬ λ©λλ€.
| METHOD | URL | DESCRIPTION | μΈμ¦ |
|---|---|---|---|
| GET | /channel | μ±λ λͺ©λ‘ | N |
| GET | /channel/<channel> | <channel>μ μν κ°κ·Έ, μ¬μ§ λͺ©λ‘ | N |
| GET | /tag | νκ·Έ λͺ©λ‘ | N |
| GET | /gag | κ°κ·Έ, μ¬μ§ λͺ©λ‘ | N |
| GET | /gag/<gag id> | νΉμ <gag id>μ λν μ 보 | N |
| GET | /gag/<gag id>/image | κ°μ₯ ν° μ¬μ΄μ¦ μ΄λ―Έμ§ | N |
| POST | /gag/<gag id>/tag/<tag> | κ°κ·Έμ νκ·Έ μΆκ° | Y |
| DELETE | /gag/<gag id>/tag/<tag> | κ°κ·Έμ νκ·Έ μμ | Y |
| POST | /gag | μ¬μ§ μ λ‘λ | Y |
| DELETE | /gag/<gag id> | μ¬μ§ μμ | Y |
| GET | /search | κ²μ | N |
λͺ¨λ μμ²μ λν μλ΅μ application/json ννλ‘ μ 곡λλ©° JSONP νν λ±μ μ¬μ© νΈμλ₯Ό μν΄ λͺ¨λ HTTP μλ΅ μ½λλ 200 μΌλ‘ μ 곡λ©λλ€.
HTTP/1.1 200 OK
Server: nginx
Content-Type: application/json
{}μ΄μ λ°λΌ λͺ¨λ μλ΅μ, λ€μκ³Ό κ°μ ννλ₯Ό μ·¨ν©λλ€.
{
"meta": {
"status": 200,
"message": "OK"
},
"response": { ... }
}JSONP μ§μμ μν΄, jsonp= νΉμ callback= νμμ μΈμλ₯Ό μ§μν©λλ€. APIνΈμΆμ ν΄λΉ μΈμλ₯Ό ν¬ν¨νμ¬ νΈμΆν κ²½μ°, μλ΅μ ν΄λΉ μΈμλ‘ μ λ¬λ ν¨μλ₯Ό νΈμΆνλ νμμΌλ‘ λ³κ²½λ©λλ€.
μμ²μ΄ μΌμ κ°―μλ₯Ό λμ΄κ° κ²½μ°, meta μλ΅μ νμ΄μ§ μ λ³΄κ° ν¬ν¨λ©λλ€. λ°λΌμ λ€μκ³Ό κ°μ ννλ‘ νμ΄μ§ μμ²μ ν μ μμ΅λλ€.
meta μλ΅μ ν¬ν¨λλ νμ΄μ§ μ 보λ μλμ κ°μ νμ μ λλ€.
{
"meta": {
"paging": {
"next": 2,
"cur": 1,
"prev": null
}
}
}κ°9 μ 체 μ±λ λͺ©λ‘μ λ°ν ν©λλ€.
| νλλͺ | Type | κΈ°λ₯ | μ€λͺ |
|---|---|---|---|
| name | String | μ±λλͺ | κ³ μ ν ꡬλΆμ(Uniqye Key)μ λλ€. |
| url | String | μ£Όμ | μΉμμ μ±λμ μ κ·Όν μ μλ κ³ μ λ§ν¬(Permalink)μ λλ€. |
| feed | String | νΌλμ£Όμ | μ±λμ μ λ°μ΄νΈλ₯Ό λ°μλ³Ό μ μλ RSS μ£Όμ μ λλ€. |
| last_published_at | String | μ΅κ·Όνλͺ© | μ±λμ κ°μ₯ λ§μ§λ§μ μ λ‘λλ κ°κ·Έμ μκ°μΌλ‘ ISO8601 νμ μ λλ€. |
| count | Number | νλͺ©κ°―μ | μ±λμ μ λ‘λ λμ΄ μλ νλͺ©μ μ΄ μ μ λλ€. |
| latest_gag | GAG | μ΅κ·Όνλͺ© | μ±λμ κ°μ₯ λ§μ§λ§μ μ λ‘λλ νλͺ©μ λ°μ΄ν° μ λλ€. |
{
"meta": {
"status": 200,
"message": "OK"
},
"response": [
{
"name": "GAE9",
"url": "http://gae9.com/channel/1",
"feed": "http://gae9.com/channel/1/feed",
"last_published_at": "2012-11-05T11:11:11Z",
"count": 9292,
"latest_gag": { ... }
},
]
}μ§μ ν <channel> μ 보λ₯Ό λ°ν ν©λλ€.
| νλλͺ | Type | κΈ°λ₯ | μ€λͺ |
|---|---|---|---|
| name | String | μ±λλͺ | κ³ μ ν ꡬλΆμ(Uniqye Key)μ λλ€. |
| url | String | μ£Όμ | μΉμμ μ±λμ μ κ·Όν μ μλ κ³ μ λ§ν¬(Permalink)μ λλ€. |
| feed | String | νΌλμ£Όμ | μ±λμ μ λ°μ΄νΈλ₯Ό λ°μλ³Ό μ μλ RSS μ£Όμ μ λλ€. |
| last_published_at | String | μ΅κ·Όνλͺ© | μ±λμ κ°μ₯ λ§μ§λ§μ μ λ‘λλ κ°κ·Έμ μκ°μΌλ‘ ISO8601 νμ μ λλ€. |
| count | Number | νλͺ©κ°―μ | μ±λμ μ λ‘λ λμ΄ μλ νλͺ©μ μ΄ μ μ λλ€. |
| latest_gag | GAG | μ΅κ·Όνλͺ© | μ±λμ κ°μ₯ λ§μ§λ§μ μ λ‘λλ νλͺ©μ λ°μ΄ν° μ λλ€. |
{
"meta": {
"status": 200,
"message": "OK"
},
"response": {
"name": "GAE9",
"url": "http://gae9.com/channel/1",
"feed": "http://gae9.com/channel/1/feed",
"last_published_at": "2012-11-05T11:11:11Z",
"count": 9292,
"latest_gag": { ... }
}
}λ±λ‘λ λͺ¨λ νκ·Έμ λͺ©λ‘μ λ°νν©λλ€.
| νλλͺ | Type | κΈ°λ₯ | μ€λͺ |
|---|---|---|---|
| name | String | μ΄λ¦ | νκ·Έλͺ |
| permalink | String | κ³ μ μ£Όμ | κ·Έμ κ³ μ μ£Όμ(URL) |
| count | Number | μ΄κ°―μ | ν΄λΉ νκ·Έλ‘ νκΉ λ 컨ν μΈ μ μ |
{
"meta": {
"status": 200,
"message": "OK"
},
"response": [
{
"name": "\\uace0\\uc591\\uc774",
"permalink": "http://gae9.com/search?tags=\uace0\uc591\uc774",
"count": 100
}
]
}μ 체 κ°κ·Έ λͺ©λ‘μ λ°νν©λλ€.
/gag/<gag id> νλͺ©μ μ°Έκ³ νμΈμ.
<gag id> μ ν΄λΉνλ λ΄μ©μ λ°νν©λλ€.
| νλλͺ | Type | κΈ°λ₯ | μ€λͺ |
|---|---|---|---|
| id | String | κ³ μ ID | ν΄λΉ κ°κ·Έμ κ³ μ ꡬλΆμ(Unique Key) μ λλ€. |
| permalink | String | κ³ μ μ£Όμ | ν΄λΉ κ°κ·Έλ₯Ό κ³ μ νκ² νννλ URL μ λλ€. |
| author | Hash | μμ±μ | Β |
| author.id | String | κ³ μ ID | μμ±μμ κ³ μ ꡬλΆμ(Unique Key) μ λλ€. |
| author.name | String | μμ±μλͺ | μμ±μμ νμλͺ (Screen Name) μ λλ€. |
| title | String | μ λͺ© | ν΄λΉ κ°κ·Έμ μ λͺ© |
| published_at | String | μμ±μΌ | ISO8601 νμμ κ°κ·Έ μμ±μΌ μ λλ€. |
| score | Number | μ μ | ν΄λΉ κ°κ·Έκ° νλν μ μ μ λλ€. |
| share | Number | 곡μ | ν΄λΉ κ°κ·Έκ° SNSμμ 곡μ λ μλ₯Ό λνλ λλ€. |
| likes | Number | μ’μμ | ν΄λΉ κ°κ·Έκ° μ¬μ΄νΈμμ νλν μ’μμμ μλ₯Ό λνλ λλ€. |
| tags | Array | νκ·Έ | Β |
| tags.name | String | νκ·Έλͺ | ν΄λΉ κ°κ·Έμ νκ·Έλ νκ·Έμ μ΄λ¦μ λλ€. |
| tags.permalink | String | νκ·Έμ£Όμ | ν΄λΉ νκ·Έμ λν κ³ μ URL μ λλ€. |
| images | Array | μ΄λ―Έμ§ | ν¬κΈ°λ³ μ΄λ―Έμ§ μ’ λ₯λ₯Ό λνλ λλ€. |
| images.name | String | μ’ λ₯ | μ΄λ―Έμ§μ μ’ λ₯λ₯Ό λνλ λλ€. |
| images.width | Number | κ°λ‘ν¬κΈ° | μ΄λ―Έμ§μ κ°λ‘ν¬κΈ°(λ¨μ: px)λ₯Ό λνλ λλ€. |
| images.height | Number | μΈλ‘ν¬κΈ° | μ΄λ―Έμ§μ μΈλ‘ν¬κΈ°(λ¨μ: px)λ₯Ό λνλ λλ€. |
| images.url | String | μ£Όμ | μ΄λ―Έμ§μ URL μ λλ€. |
| source | String | μΆμ² | ν΄λΉ 컨ν μΈ μ μΆμ²λ₯Ό λνλ λλ€. |
| type | String | μ’ λ₯ | ν΄λΉ 컨ν μΈ μ μ’ λ₯λ₯Ό λνλ λλ€.(image|video) |
| type_features | Hash | λΆκ°μ 보 | μ’ λ₯λ³λ‘ μΆκ°μ μΈ μ λ³΄κ° λ΄κΉλλ€. |
κ°9 μμ μ 곡νλ λͺ¨λ 컨ν μΈ λ image νΉμ video μ€ νλμ μ’ λ₯μ λλ€. μνκΉκ²λ, 컨ν μΈ μ€ μΌλΆλ μΈλΆμ¬μ μμ 컨ν μΈ μ μμ‘΄ν΄μΌ νλ―λ‘ API μμ νμ€νλ μλ΅μ μ 곡νκΈ° μ΄λ €μ΄ λ©΄μ΄ μμ΅λλ€.
λ°λΌμ, κ°9 μμλ type_features λΌλ λΆκ°μ 보λ₯Ό κ° μ»¨ν μΈ μ’ λ₯μ λ§κ² μΆκ°μ μΈ μλ΅μΌλ‘ μ 곡ν©λλ€.
"type-features": {
"content-type": "image/gif"
"animated": true
}type_features["provider"] μ 보μ λ°λΌμ κ° λ€λ₯Έ ννμ λΆκ°μ λ³΄κ° ν¬ν¨λ©λλ€.
"type_features": {
"permalink": "http://youtu.be/lhe7IiQ_4xA",
"provider": "youtube",
"thumbnails": {
"default": "http://img.youtube.com/vi/lhe7IiQ_4xA/default.jpg",
"hqdefault": "http://img.youtube.com/vi/lhe7IiQ_4xA/hqdefault.jpg"
}
}"type_features": {
"permalink": "http://vimeo.com/52942657",
"provider": "vimeo",
"oembed": "http://vimeo.com/api/oembed.json?url=http%3A//vimeo.com/52942657"
}"type_features": {
"permalink": "http://tvpot.daum.net/v/vc8abuorokllLLHxlkuTxEx",
"provider": "tvpot",
"thumbnails": {
"default": "http://i1.daumcdn.net/svc/image/U03/tvpot_thumb/vc8abuorokllLLHxlkuTxEx/thumb.png",
"thumb_1": "http://i1.daumcdn.net/svc/image/U03/tvpot_thumb/vc8abuorokllLLHxlkuTxEx/1.png",
"thumb_2": "http://i1.daumcdn.net/svc/image/U03/tvpot_thumb/vc8abuorokllLLHxlkuTxEx/2.png",
"thumb_3": "http://i1.daumcdn.net/svc/image/U03/tvpot_thumb/vc8abuorokllLLHxlkuTxEx/3.png",
}
}κ°9 μμλ νΉμ κ°κ·Έμ μ΄λ―Έμ§μ λν΄μ λ€μν ν¬κΈ°μ μ΄λ―Έμ§λ₯Ό μμ±νμ¬ μ 곡ν©λλ€.
| μ’ λ₯ | ν¬κΈ° κ·μΉ |
|---|---|
| full | μλ³Έ ν¬κΈ° |
| thumbnail | κ°λ‘ ν¬κΈ°λ₯Ό μ΅λ 480px κΉμ§ (id 172κΉμ§λ 640px) νμ©νλ ν¬κΈ°λ‘ μ‘°μ λ©λλ€. |
| small | 80px*80px ν¬κΈ°μ μ μ¬κ°νμΌλ‘ μ‘°μ ν©λλ€. |
λ§μ½, μ λ‘λλ 컨ν μΈ κ° Animated GIF λΌλ©΄ λ€μ κ·μΉμ λ°λ¦ λλ€.
| full | μλ³Έμ μλλ©μ΄μ μ κ·Έλλ‘ μ μ§ν©λλ€. |
| thumbnail | 첫 νλ μλ§ μΆμΆνμ¬ μ μ μ΄λ―Έμ§λ‘ μμ±ν©λλ€.(ν¬κΈ° λ³κ²½ μμ) |
| small | 첫 νλ μλ§ μΆμΆνμ¬ μ μ μ΄λ―Έμ§λ‘ μμ±ν©λλ€.(ν¬κΈ° λ³κ²½ μμ) |
{
"meta": {
"status": 200,
"message": "OK"
},
"response": {
"id": "16232",
"permalink": "http://gae9.com/gag/16232",
"author": {
"id": "5",
"name": "kkungkkung"
},
"title": "\\uc800\\uae30.. \\ud558\\uc774\\ud30c\\uc774\\ube0c\\uc880 \\ud574\\uc8fc\\uc9c0 \\uc54a\\uc744\\ub798?",
"published_at": "2012-10-25T02:10:00Z",
"score": 7,
"share": 13,
"likes": 4,
"tags": [
{
"name": "\\uace0\\uc591\\uc774",
"permalink": "http://gae9.com/search?tags=\uace0\uc591\uc774"
}
],
"images": [
{
"name": "full",
"width": 1024,
"height" 768,
"url": ""
},
{
"name": "thumbnail",
"width": 480,
"height": 480,
"url": ""
},
{
"name": "small",
"width": 80,
"height": 80,
"url": ""
}
],
"type": "image",
"type_features": {
"content-type": "image/jpeg"
}
"source": "http://imgur.com/gallery/ZoEY8",
}
}<gag id> μ ν΄λΉνλ λ΄μ©μ κ°μ₯ ν° μ΄λ―Έμ§ μ£Όμλ₯Ό 302 Found Redirect ν©λλ€.
μ£Όμ: λΉ APIλ μ μΌνκ² api.gae9.com μ΄ μλ gae9.com μΌλ‘ νΈμΆ ν©λλ€.
- 415 UNSUPPORTED MEDIA TYPE: λμμλ± λ¨μν μ¬μ©ν μ μλ κ²½μ° λ°νλ©λλ€.
- 302 Found: μ΄λ―Έμ§μ μ£Όμμ λλ€.
λ€μν λ°©λ²μΌλ‘ κ°9 컨ν μΈ λ₯Ό κ²μν μ μλ κΈ°λ₯μ λλ€.
κ²μ APIλ λ€μκ³Ό κ°μ μ’ λ₯μ μΈμλ₯Ό μ§μνλ©°, 2κ°μ μΈμλ₯Ό μ‘°ν©νμ¬ μ¬μ©ν μ μμΌλ©°, sort λ₯Ό μ μΈν νκ°μ§ μ΄μμ μΈμκ° μ 곡λμ΄μΌ ν©λλ€.
| μ’ λ₯ | μ€λͺ | κΈ°λ³Έκ° |
|---|---|---|
| q | μ λͺ©λ±μ κ²μμ΄ | NULL |
| tags | λμ΄μ°κΈ°λ‘ ꡬλΆνλ νκ·Έ λͺ©λ‘μΌλ‘ AND μ§μ μ λλ€. | NULL |
| type | 컨ν μΈ μ’ λ₯(image, animated, video) | NULL |
| sort | μ λ ¬ λ°©λ²μ μ μν©λλ€. | hot |
| channel | νΉμ μ±λλͺ λλ μ±λμ IDλ‘ κ²μν©λλ€. | NULL |
μ λ ¬ λ°©μμ λ€μκ³Ό κ°μ κ°μ΄ μ§μλ©λλ€.
| sort | μ€λͺ |
|---|---|
| hot | μ΅μ κ°κ·Έλ€ μ€ μΈκΈ°μλ νλͺ©λ€ |
| best | νΉμ κ°―μμ μ΅μ κΈ μ€μμ κ°μ₯ μ μκ° λμ νλͺ© |
| new | μ΅μ μ |
/gag μ κ°μ νμμΌλ‘ μλ΅μ΄ μ 곡λ©λλ€.
- GET http://api.gae9.com/search?tags=μμ΄μ %20νΈμν μΌ