개요

HTTP 동사

본 REST API에서 사용하는 HTTP 동사(verbs)는 가능한한 표준 HTTP와 REST 규약을 따릅니다.

동사 용례

GET

리소스를 가져올 때 사용

POST

새 리소스를 만들 때 사용

PUT

기존 리소스를 수정할 때 사용

PATCH

기존 리소스의 일부를 수정할 때 사용

DELETE

기존 리소스를 삭제할 떄 사용

HTTP 상태 코드

본 REST API에서 사용하는 HTTP 상태 코드는 가능한한 표준 HTTP와 REST 규약을 따릅니다.

상태 코드 용례

200 OK

요청을 성공적으로 처리함

201 Created

새 리소스를 성공적으로 생성함. 응답의 Location 헤더에 해당 리소스의 URI가 담겨있다.

204 No Content

기존 리소스를 성공적으로 수정함.

400 Bad Request

잘못된 요청을 보낸 경우. 응답 본문에 더 오류에 대한 정보가 담겨있다.

404 Not Found

요청한 리소스가 없음.

오류

에러 응답이 발생했을 때 (상태 코드 >= 400), 본문에 해당 문제를 기술한 JSON 객체가 담겨있다.

Auth Error

Error0001

Response body
{
  "timestamp" : "2020-12-15T00:05:32.734",
  "status" : 202,
  "error" : "0001",
  "message" : "ID: TestUser1 이미 사용중인 아이디입니다."
}

Error0002

Response body
{
  "timestamp" : "2020-12-15T00:05:31.065",
  "status" : 403,
  "error" : "0002",
  "message" : "ID: TestUser1 회원가입이 되어있지 않거나 잠긴 계정입니다."
}

Error0003

Response body
{
  "timestamp" : "2020-12-15T00:05:29.274",
  "status" : 403,
  "error" : "0003",
  "message" : "유효하지 않은 토큰입니다."
}

Error0004

Response body
{
  "timestamp" : "2020-12-15T00:05:29.365",
  "status" : 403,
  "error" : "0004",
  "message" : "손상된 토큰입니다."
}

Error0005

Response body
{
  "timestamp" : "2020-12-15T00:05:27.455",
  "status" : 403,
  "error" : "0005",
  "message" : "잘못된 인증입니다."
}

Error0006

Response body
{
  "timestamp" : "2020-12-15T00:05:27.568",
  "status" : 403,
  "error" : "0006",
  "message" : "만료된 토큰입니다."
}

Error0007

Response body
{
  "timestamp" : "2020-12-15T00:05:32.827",
  "status" : 202,
  "error" : "0007",
  "message" : "Nickname: 테스트 유저 1 이미 사용중인 닉네임입니다."
}

Community Error

Error1001

Response body
{
  "timestamp" : "2020-12-15T00:04:38.764",
  "status" : 400,
  "error" : "1001",
  "message" : "존재하지 않거나 수정 권한이 없습니다."
}

Training Error

Error1101
Response body
{
  "timestamp" : "2020-12-15T00:05:06.176",
  "status" : 404,
  "error" : "1101",
  "message" : "존재하지 않는 트레이닝입니다."
}

System Error

Error2001

Response body
{
  "timestamp" : "2020-12-15T00:05:26.054",
  "status" : 400,
  "error" : "2001",
  "message" : "Unrecognized field \"message\" "
}

Image Error

Error3001

Response body
{
  "timestamp" : "2020-12-15T00:04:56.214",
  "status" : 400,
  "error" : "3001",
  "message" : "파일명에 부적합 문자가 포함되어 있습니다. test..jpg"
}

Error3002

Response body
{
  "timestamp" : "2020-12-15T00:04:51.497",
  "status" : 404,
  "error" : "3002",
  "message" : "TestUser1 파일을 찾을 수 없습니다."
}

하이퍼미디어

본 REST API는 하이퍼미디어와 사용하며 응답에 담겨있는 리소스는 다른 리소스에 대한 링크를 가지고 있다. 응답은 Hypertext Application from resource to resource. Language (HAL) 형식을 따른다. 링크는 `_links`라는 키로 제공한다. 본 API의 사용자(클라이언트)는 URI를 직접 생성하지 않아야 하며, 리소스에서 제공하는 링크를 사용해야 한다.

서비스 모듈

트레이닝 서비스

트레이닝 등록

Training-S101 트레이닝 등록하기

Post 요청을 사용해서 트레이닝을 작성 할 수 있다.

HTTP request
POST /trainings HTTP/1.1
Content-Type: application/json;charset=UTF-8
Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJUZXN0VXNlcjEiLCJyb2xlcyI6WyJST0xFX1VTRVIiXSwibmlja05hbWUiOiLthYzsiqTtirgg7Jyg7KCAIDEiLCJpYXQiOjE2MDc5NTgzMDksImV4cCI6MTYwNzk1ODkwOX0.SRrcWqrGKiCjF2ApCsw7HBlwFrBs2EajrdLsbWmVd1k
Content-Length: 94
Host: templet.restapi.com

{
  "title" : "트레이닝 제목",
  "body" : "트레이닝 입력 테스트입니다."
}
Example response
HTTP/1.1 201 Created
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Location: https://templet.restapi.com/trainings/1
Content-Type: application/hal+json;charset=UTF-8
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
Strict-Transport-Security: max-age=31536000 ; includeSubDomains
X-Frame-Options: DENY
Content-Length: 208

{
  "_links" : {
    "self" : {
      "href" : "https://templet.restapi.com/trainings/1"
    },
    "profile" : {
      "href" : "https://templet.restapi.com/docs/index.html#sendTraining"
    }
  }
}
Training-S105 트레이닝 수정하기

Put 요청을 사용해서 트레이닝을 수정 할 수 있다.

Path parameters
Table 1. /trainings/{trainingId}
Parameter Description

trainingId

트레이닝 아이디

HTTP request
PUT /trainings/1 HTTP/1.1
Content-Type: application/json;charset=UTF-8
Content-Length: 97
Host: templet.restapi.com

{
  "title" : "수정된 트레이닝",
  "body" : "트레이닝 수정 테스트입니다."
}
Example response
HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/hal+json;charset=UTF-8
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
Strict-Transport-Security: max-age=31536000 ; includeSubDomains
X-Frame-Options: DENY
Content-Length: 210

{
  "_links" : {
    "self" : {
      "href" : "https://templet.restapi.com/trainings/1"
    },
    "profile" : {
      "href" : "https://templet.restapi.com/docs/index.html#updateTraining"
    }
  }
}
Training-S106 트레이닝 삭제하기

Delete 요청을 사용해서 트레이닝을 삭제 할 수 있다.

Path parameters
Table 1. /trainings/{trainingId}
Parameter Description

trainingId

트레이닝 아이디

HTTP request
DELETE /trainings/1 HTTP/1.1
Host: templet.restapi.com
Example response
HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/hal+json;charset=UTF-8
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
Strict-Transport-Security: max-age=31536000 ; includeSubDomains
X-Frame-Options: DENY
Content-Length: 210

{
  "_links" : {
    "self" : {
      "href" : "https://templet.restapi.com/trainings/1"
    },
    "profile" : {
      "href" : "https://templet.restapi.com/docs/index.html#deleteTraining"
    }
  }
}
Training-S107 썸네일 이미지 삽입

Post 요청을 사용해서 썸네일 이미지를 수정할 수 있다.

Path parameters
Table 1. /thumbnail/{trainingId}
Parameter Description

trainingId

트레이닝 번호

Example request
$ curl 'https://templet.restapi.com/thumbnail/2' -i -X POST \
    -H 'Content-Type: multipart/form-data;charset=UTF-8' \
    -H 'Accept: application/hal+json' \
    -F 'image=@test.jpg;type=image/jpeg'
Example response
HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
Strict-Transport-Security: max-age=31536000 ; includeSubDomains
X-Frame-Options: DENY

트레이닝 리스트 조회

Training-S201 트레이닝 검색하기

Get 요청을 사용해서 트레이닝 목록을 조회 할 수 있다.

HTTP request
GET /trainings?page=1&size=2&sort=title%2CDESC HTTP/1.1
Host: templet.restapi.com
Example response
HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/hal+json;charset=UTF-8
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
Strict-Transport-Security: max-age=31536000 ; includeSubDomains
X-Frame-Options: DENY
Content-Length: 1539

{
  "_embedded" : {
    "trainingList" : [ {
      "trainingId" : 11,
      "title" : "트레이닝4",
      "body" : "트레이닝 본문입니다.",
      "trainer" : "테스트 유저 4",
      "views" : 0,
      "modifiedDate" : "2020-12-15T00:05:06.537",
      "_links" : {
        "self" : {
          "href" : "https://templet.restapi.com/trainings/11"
        }
      }
    }, {
      "trainingId" : 10,
      "title" : "트레이닝3",
      "body" : "트레이닝 본문입니다.",
      "trainer" : "테스트 유저 3",
      "views" : 0,
      "modifiedDate" : "2020-12-15T00:05:06.458",
      "_links" : {
        "self" : {
          "href" : "https://templet.restapi.com/trainings/10"
        }
      }
    } ]
  },
  "_links" : {
    "first" : {
      "href" : "https://templet.restapi.com/trainings?page=0&size=2&sort=title,desc"
    },
    "prev" : {
      "href" : "https://templet.restapi.com/trainings?page=0&size=2&sort=title,desc"
    },
    "self" : {
      "href" : "https://templet.restapi.com/trainings?page=1&size=2&sort=title,desc"
    },
    "next" : {
      "href" : "https://templet.restapi.com/trainings?page=2&size=2&sort=title,desc"
    },
    "last" : {
      "href" : "https://templet.restapi.com/trainings?page=2&size=2&sort=title,desc"
    },
    "profile" : {
      "href" : "https://templet.restapi.com/docs/index.html#getTrainings"
    }
  },
  "page" : {
    "size" : 2,
    "totalElements" : 6,
    "totalPages" : 3,
    "number" : 1
  }
}
Training-S202 트레이닝 목록 조회

Get 요청을 사용해서 트레이닝을 검색 할 수 있다.

HTTP request
GET /trainings?search=1 HTTP/1.1
Host: templet.restapi.com
Example response
HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/hal+json;charset=UTF-8
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
Strict-Transport-Security: max-age=31536000 ; includeSubDomains
X-Frame-Options: DENY
Content-Length: 728

{
  "_embedded" : {
    "trainingList" : [ {
      "trainingId" : 2,
      "title" : "트레이닝1",
      "body" : "트레이닝 본문입니다.",
      "trainer" : "테스트 유저 1",
      "views" : 0,
      "modifiedDate" : "2020-12-15T00:05:05.567",
      "_links" : {
        "self" : {
          "href" : "https://templet.restapi.com/trainings/2"
        }
      }
    } ]
  },
  "_links" : {
    "self" : {
      "href" : "https://templet.restapi.com/trainings?page=0&size=20"
    },
    "profile" : {
      "href" : "https://templet.restapi.com/docs/index.html#getTrainings"
    }
  },
  "page" : {
    "size" : 20,
    "totalElements" : 1,
    "totalPages" : 1,
    "number" : 0
  }
}
Training-S203 썸네일 이미지 조회

Get 요청을 사용해서 썸네일 이미지를 조회할 수 있다.

Path parameters
Table 1. /thumbnail/{trainingId}
Parameter Description

trainingId

트레이닝 번호

HTTP request
GET /thumbnail/1 HTTP/1.1
Host: templet.restapi.com

트레이닝 하기

Training-S301 트레이닝 정보 조회

Get 요청을 사용해서 트레이닝을 조회 할 수 있다.

Path parameters
Table 1. /trainings/{trainingId}
Parameter Description

trainingId

트레이닝 아이디

HTTP request
GET /trainings/14 HTTP/1.1
Host: templet.restapi.com
Example response
HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/hal+json;charset=UTF-8
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
Strict-Transport-Security: max-age=31536000 ; includeSubDomains
X-Frame-Options: DENY
Content-Length: 595

{
  "title" : "트레이닝1",
  "trainerId" : "TestUser1",
  "trainer" : "테스트 유저 1",
  "body" : "트레이닝 본문입니다.",
  "views" : 1,
  "likes" : 0,
  "subscribe" : false,
  "like" : false,
  "createdDate" : "2020-12-15T00:05:06.907",
  "modifiedDate" : "2020-12-15T00:05:06.907",
  "_links" : {
    "self" : {
      "href" : "https://templet.restapi.com/trainings/14"
    },
    "sendComment" : {
      "href" : "https://templet.restapi.com"
    },
    "profile" : {
      "href" : "https://templet.restapi.com/docs/index.html#getTraining"
    }
  }
}
Training-S302 트레이닝 포즈 정보 조회

Get 요청을 사용해서 트레이닝 포즈 데이터를 조회 할 수 있다.

HTTP request
GET /trainings/1/poses HTTP/1.1
Host: templet.restapi.com
Example response
HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/hal+json;charset=UTF-8
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
Strict-Transport-Security: max-age=31536000 ; includeSubDomains
X-Frame-Options: DENY
Content-Length: 4634

{
  "frames" : [ {
    "frameNo" : 0,
    "keyPoint" : [ {
      "y" : 156.9791717529297,
      "x" : 955.0,
      "part" : "nose",
      "score" : 0.9094806909561157
    }, {
      "y" : 138.5833282470703,
      "x" : 964.1944580078125,
      "part" : "left_eye",
      "score" : 0.9192264080047607
    }, {
      "y" : 138.5833282470703,
      "x" : 936.611083984375,
      "part" : "right_eye",
      "score" : 0.9601777791976929
    }, {
      "y" : 156.9791717529297,
      "x" : 991.7777709960938,
      "part" : "left_ear",
      "score" : 0.9775797724723816
    }, {
      "y" : 156.9791717529297,
      "x" : 909.0277709960938,
      "part" : "right_ear",
      "score" : 0.9318939447402954
    }, {
      "y" : 248.9583282470703,
      "x" : 1037.75,
      "part" : "left_shoulder",
      "score" : 0.8265610933303833
    }, {
      "y" : 248.9583282470703,
      "x" : 872.25,
      "part" : "right_shoulder",
      "score" : 0.8222082257270813
    }, {
      "y" : 386.9270935058594,
      "x" : 1046.9444580078125,
      "part" : "left_elbow",
      "score" : 0.8991424441337585
    }, {
      "y" : 368.53125,
      "x" : 872.25,
      "part" : "right_elbow",
      "score" : 0.8917467594146729
    }, {
      "y" : 469.7083435058594,
      "x" : 982.5833129882812,
      "part" : "left_wrist",
      "score" : 0.7982574701309204
    }, {
      "y" : 442.1145935058594,
      "x" : 955.0,
      "part" : "right_wrist",
      "score" : 0.8603919744491577
    }, {
      "y" : 469.7083435058594,
      "x" : 991.7777709960938,
      "part" : "left_hip",
      "score" : 0.6913819313049316
    }, {
      "y" : 469.7083435058594,
      "x" : 899.8333129882812,
      "part" : "right_hip",
      "score" : 0.7119119167327881
    }, {
      "y" : 662.8645629882812,
      "x" : 991.7777709960938,
      "part" : "left_knee",
      "score" : 0.8208074569702148
    }, {
      "y" : 681.2604370117188,
      "x" : 918.2222290039062,
      "part" : "right_knee",
      "score" : 0.7733436822891235
    }, {
      "y" : 846.8229370117188,
      "x" : 964.1944580078125,
      "part" : "left_ankle",
      "score" : 0.8417468070983887
    }, {
      "y" : 874.4166870117188,
      "x" : 909.0277709960938,
      "part" : "right_ankle",
      "score" : 0.8045114874839783
    } ]
  }, {
    "frameNo" : 1,
    "keyPoint" : [ {
      "y" : 151.5,
      "x" : 952.9444580078125,
      "part" : "nose",
      "score" : 0.951569139957428
    }, {
      "y" : 133.375,
      "x" : 971.0555419921875,
      "part" : "left_eye",
      "score" : 0.9497162699699402
    }, {
      "y" : 142.4375,
      "x" : 934.8333129882812,
      "part" : "right_eye",
      "score" : 0.9058775901794434
    }, {
      "y" : 151.5,
      "x" : 989.1666870117188,
      "part" : "left_ear",
      "score" : 0.9232050776481628
    }, {
      "y" : 160.5625,
      "x" : 916.7222290039062,
      "part" : "right_ear",
      "score" : 0.9376944899559021
    }, {
      "y" : 251.1875,
      "x" : 1034.4444580078125,
      "part" : "left_shoulder",
      "score" : 0.8404182195663452
    }, {
      "y" : 242.125,
      "x" : 871.4444580078125,
      "part" : "right_shoulder",
      "score" : 0.8220759034156799
    }, {
      "y" : 387.125,
      "x" : 1034.4444580078125,
      "part" : "left_elbow",
      "score" : 0.9172118902206421
    }, {
      "y" : 359.9375,
      "x" : 871.4444580078125,
      "part" : "right_elbow",
      "score" : 0.8612682223320007
    }, {
      "y" : 459.625,
      "x" : 971.0555419921875,
      "part" : "left_wrist",
      "score" : 0.7992289066314697
    }, {
      "y" : 450.5625,
      "x" : 971.0555419921875,
      "part" : "right_wrist",
      "score" : 0.8581046462059021
    }, {
      "y" : 468.6875,
      "x" : 998.2222290039062,
      "part" : "left_hip",
      "score" : 0.6640511155128479
    }, {
      "y" : 468.6875,
      "x" : 907.6666870117188,
      "part" : "right_hip",
      "score" : 0.684273362159729
    }, {
      "y" : 659.0,
      "x" : 998.2222290039062,
      "part" : "left_knee",
      "score" : 0.8123100399971008
    }, {
      "y" : 668.0625,
      "x" : 916.7222290039062,
      "part" : "right_knee",
      "score" : 0.7620736956596375
    }, {
      "y" : 849.3125,
      "x" : 971.0555419921875,
      "part" : "left_ankle",
      "score" : 0.8121398687362671
    }, {
      "y" : 876.5,
      "x" : 907.6666870117188,
      "part" : "right_ankle",
      "score" : 0.8169323205947876
    } ]
  } ]
}

댓글

Community-S101 댓글 작성

Post 요청을 사용해서 댓글을 작성 할 수 있다.

Path parameters
Table 1. /comments/{trainingId}
Parameter Description

trainingId

트레이닝 번호

HTTP request
POST /comments/1 HTTP/1.1
Content-Type: application/json;charset=UTF-8
Content-Length: 38
Host: templet.restapi.com

{
  "message" : "댓글 테스트"
}
Example response
HTTP/1.1 201 Created
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/hal+json;charset=UTF-8
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
Strict-Transport-Security: max-age=31536000 ; includeSubDomains
X-Frame-Options: DENY
Content-Length: 197

{
  "_links" : {
    "self" : {
      "href" : "https://templet.restapi.com/1"
    },
    "profile" : {
      "href" : "https://templet.restapi.com/docs/index.html#sendComment"
    }
  }
}
Community-S102 댓글 수정

Put 요청을 사용해서 댓글을 수정 할 수 있다.

Path parameters
Table 1. /comments/{commentId}
Parameter Description

commentId

댓글 번호

HTTP request
PUT /comments/1 HTTP/1.1
Content-Type: application/json;charset=UTF-8
Content-Length: 45
Host: templet.restapi.com

{
  "message" : "댓글 수정 테스트"
}
Example response
HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/hal+json;charset=UTF-8
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
Strict-Transport-Security: max-age=31536000 ; includeSubDomains
X-Frame-Options: DENY
Content-Length: 199

{
  "_links" : {
    "self" : {
      "href" : "https://templet.restapi.com/1"
    },
    "profile" : {
      "href" : "https://templet.restapi.com/docs/index.html#updateComment"
    }
  }
}
Community-S103 댓글 삭제

Delete 요청을 사용해서 댓글을 삭제 할 수 있다.

Path parameters
Table 1. /comments/{commentId}
Parameter Description

commentId

댓글 번호

HTTP request
DELETE /comments/2 HTTP/1.1
Host: templet.restapi.com
Example response
HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/hal+json;charset=UTF-8
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
Strict-Transport-Security: max-age=31536000 ; includeSubDomains
X-Frame-Options: DENY
Content-Length: 199

{
  "_links" : {
    "self" : {
      "href" : "https://templet.restapi.com/2"
    },
    "profile" : {
      "href" : "https://templet.restapi.com/docs/index.html#deleteComment"
    }
  }
}
Community-S104 댓글 조회

Get 요청을 사용해서 댓글들을 조회할 수 있다.

HTTP request
GET /trainings/1/comments HTTP/1.1
Host: templet.restapi.com
Example response
HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/hal+json;charset=UTF-8
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
Strict-Transport-Security: max-age=31536000 ; includeSubDomains
X-Frame-Options: DENY
Content-Length: 923

{
  "_embedded" : {
    "commentList" : [ {
      "commentId" : 1,
      "message" : "댓글 테스트",
      "commenterId" : "TestUser1",
      "createdDate" : "2020-12-15T00:04:42.653",
      "modifiedDate" : "2020-12-15T00:04:42.654",
      "_links" : {
        "self" : {
          "href" : "https://templet.restapi.com/trainings/1"
        },
        "updateComment" : {
          "href" : "https://templet.restapi.com/trainings/1"
        },
        "deleteComment" : {
          "href" : "https://templet.restapi.com/trainings/1"
        }
      }
    } ]
  },
  "_links" : {
    "self" : {
      "href" : "https://templet.restapi.com/trainings/1/comments?page=0&size=20"
    },
    "profile" : {
      "href" : "https://templet.restapi.com/docs/index.html#getComments"
    }
  },
  "page" : {
    "size" : 20,
    "totalElements" : 1,
    "totalPages" : 1,
    "number" : 0
  }
}

사용자 개인화 서비스

User-S101 트레이너 구독하기

Post 요청을 사용해서 구독을 할 수 있다.

HTTP request
POST /trainer/TestUser1 HTTP/1.1
Host: templet.restapi.com
Example response
HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
Strict-Transport-Security: max-age=31536000 ; includeSubDomains
X-Frame-Options: DENY
User-S102 트레이너 구독 취소하기

Delete 요청을 사용해서 구독을 취소 할 수 있다.

HTTP request
DELETE /trainer/TestUser1 HTTP/1.1
Host: templet.restapi.com
Example response
HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
Strict-Transport-Security: max-age=31536000 ; includeSubDomains
X-Frame-Options: DENY
User-S103 구독 리스트 조회

GET 요청을 사용해서 구독한 리스트를 조회할 수 있다.

HTTP request
GET /subscribes HTTP/1.1
Host: templet.restapi.com
Example response
HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/hal+json;charset=UTF-8
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
Strict-Transport-Security: max-age=31536000 ; includeSubDomains
X-Frame-Options: DENY
Content-Length: 78

[ {
  "trainerId" : "TestUser1",
  "trainerName" : "테스트 유저 1"
} ]
User-S201 트레이닝 좋아요

Post 요청을 사용해서 좋아요를 할 수 있다.

HTTP request
POST /trainings/1/like HTTP/1.1
Host: templet.restapi.com
Example response
HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
Strict-Transport-Security: max-age=31536000 ; includeSubDomains
X-Frame-Options: DENY
User-S202 트레이닝 좋아요 취소하기

Delete 요청을 사용해서 좋아요를 취소 할 수 있다.

HTTP request
DELETE /trainings/1/like HTTP/1.1
Host: templet.restapi.com
Example response
HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
Strict-Transport-Security: max-age=31536000 ; includeSubDomains
X-Frame-Options: DENY
User-S203 좋아요 한 트레이닝 조회

GET 사용자가 좋아요한 트레이닝 리스트를 조회할 수 있다.

HTTP request
GET /training/likes HTTP/1.1
Host: templet.restapi.com
Example response
HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/hal+json;charset=UTF-8
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
Strict-Transport-Security: max-age=31536000 ; includeSubDomains
X-Frame-Options: DENY
Content-Length: 404

[ {
  "trainingId" : 1,
  "title" : "트레이닝1",
  "body" : "트레이닝 본문입니다.",
  "trainer" : "테스트 유저 1",
  "views" : 0,
  "modifiedDate" : "2020-12-15T00:05:16.186"
}, {
  "trainingId" : 2,
  "title" : "트레이닝2",
  "body" : "트레이닝 본문입니다.",
  "trainer" : "테스트 유저 2",
  "views" : 0,
  "modifiedDate" : "2020-12-15T00:05:16.267"
} ]

프로필

User-S301 프로필 조회하기

GET 요청을 사용해서 프로필을 조회 할 수 있다.

HTTP request
GET /profile HTTP/1.1
Host: templet.restapi.com
Example response
HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/hal+json;charset=UTF-8
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
Strict-Transport-Security: max-age=31536000 ; includeSubDomains
X-Frame-Options: DENY
Content-Length: 37

{
  "name" : "테스트 유저 1"
}
User-S302 프로필 업데이트 하기

PUT 요청을 사용해서 프로필을 수정 할 수 있다.

HTTP request
PUT /profile HTTP/1.1
Content-Type: application/json;charset=UTF-8
Content-Length: 34
Host: templet.restapi.com

{
  "nickName" : "changedNick"
}
Example response
HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
Strict-Transport-Security: max-age=31536000 ; includeSubDomains
X-Frame-Options: DENY
User-S303 프로필 이미지 수정하기

Post 요청을 사용해서 프로필 이미지를 수정할 수 있다.

Path parameters
Table 1. /profile/{userId}/image
Parameter Description

userId

user id

Example request
$ curl 'https://templet.restapi.com/profile/TestUser1/image' -i -X POST \
    -H 'Content-Type: multipart/form-data;charset=UTF-8' \
    -H 'Accept: application/hal+json' \
    -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJUZXN0VXNlcjEiLCJyb2xlcyI6WyJST0xFX1VTRVIiXSwibmlja05hbWUiOiLthYzsiqTtirgg7Jyg7KCAIDEiLCJpYXQiOjE2MDc5NTgyOTYsImV4cCI6MTYwNzk1ODg5Nn0.dZg8WxOYO-5_C7r7ScAOBxt_Lm5q_8hJoU8rxJEv3Xs' \
    -F 'image=@test.jpg;type=image/jpeg'
Example response
HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
Strict-Transport-Security: max-age=31536000 ; includeSubDomains
X-Frame-Options: DENY
User-S304 프로필 이미지 조회하기

Get 요청을 사용해서 프로필 이미지를 조회할 수 있다.

Path parameters
Table 1. /profile/{userId}/image
Parameter Description

userId

user id

HTTP request
GET /profile/TestUser1/image HTTP/1.1
Host: templet.restapi.com

인증 모듈

Auth-S001 회원가입

Post 요청을 사용해서 회원가입을 할 수있다.

HTTP request

POST /auth/signup HTTP/1.1
Content-Type: application/json;charset=UTF-8
Content-Length: 123
Host: templet.restapi.com

{
  "id" : "TestUser1",
  "password" : "Password",
  "nickName" : "테스트 유저 1",
  "email" : "test@email.com"
}

Example response

HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/hal+json;charset=UTF-8
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
Strict-Transport-Security: max-age=31536000 ; includeSubDomains
X-Frame-Options: DENY
Content-Length: 466

{
  "accessToken" : "eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJUZXN0VXNlcjEiLCJyb2xlcyI6WyJST0xFX1VTRVIiXSwibmlja05hbWUiOiLthYzsiqTtirgg7Jyg7KCAIDEiLCJpYXQiOjE2MDc5NTgzMzIsImV4cCI6MTYwNzk1ODkzMn0.uH1D7DhRVzLaMy3AezOZ2YuqsJtj2DmDoPMzgnDUlZE",
  "refreshToken" : "eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJUZXN0VXNlcjEiLCJyb2xlcyI6WyJST0xFX1VTRVIiXSwibmlja05hbWUiOiLthYzsiqTtirgg7Jyg7KCAIDEiLCJpYXQiOjE2MDc5NTgzMzIsImV4cCI6MTYwODU2MzEzMn0.8VHng2_ePl4U84M_Ep9NW4sWxcH3e1xVTF0_FIJwnSQ"
}

Auth-S002 신규 아이디 중복 검사

Get 요청을 사용해서 아이디 중복확인을 할 수있다.

HTTP request

GET /auth/checkid/TestUser1 HTTP/1.1
Host: templet.restapi.com

Example response

HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/hal+json;charset=UTF-8
Content-Length: 35
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
Strict-Transport-Security: max-age=31536000 ; includeSubDomains
X-Frame-Options: DENY

사용가능한 아이디입니다.

Auth-S003 닉네임 중복 검사

Get 요청을 사용해서 닉네임 중복확인을 할 수있다.

HTTP request

GET /auth/checkNickName/%ED%85%8C%EC%8A%A4%ED%8A%B8%20%EC%9C%A0%EC%A0%80%201 HTTP/1.1
Host: templet.restapi.com

Example response

HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/hal+json;charset=UTF-8
Content-Length: 35
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
Strict-Transport-Security: max-age=31536000 ; includeSubDomains
X-Frame-Options: DENY

사용가능한 닉네임입니다.

Auth-S004 로그인

Post 요청을 사용해서 인증할수있다.

HTTP request

POST /auth/signin HTTP/1.1
Content-Type: application/json;charset=UTF-8
Content-Length: 54
Host: templet.restapi.com

{
  "id" : "TestUser1",
  "password" : "password"
}

Example response

HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/hal+json;charset=UTF-8
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
Strict-Transport-Security: max-age=31536000 ; includeSubDomains
X-Frame-Options: DENY
Content-Length: 466

{
  "accessToken" : "eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJUZXN0VXNlcjEiLCJyb2xlcyI6WyJST0xFX1VTRVIiXSwibmlja05hbWUiOiLthYzsiqTtirgg7Jyg7KCAIDEiLCJpYXQiOjE2MDc5NTgzMzAsImV4cCI6MTYwNzk1ODkzMH0.rOkn3bzrBr45jsMsN3yN4ZKk5ATi-6sLOeP7QKYYmtc",
  "refreshToken" : "eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJUZXN0VXNlcjEiLCJyb2xlcyI6WyJST0xFX1VTRVIiXSwibmlja05hbWUiOiLthYzsiqTtirgg7Jyg7KCAIDEiLCJpYXQiOjE2MDc5NTgzMzAsImV4cCI6MTYwODU2MzEzMH0.EIqp0yqkVhTOqLLxBLEEJCRQHdNtBlBiP0hl8jqE5BM"
}

Auth-S005 토큰 갱신

Post 요청을 사용해서 토큰을 재발급받을 수 있다.

HTTP request

POST /auth/refresh HTTP/1.1
Content-Type: application/json;charset=UTF-8
Content-Length: 235
Host: templet.restapi.com

{
  "refreshToken" : "eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJUZXN0VXNlcjEiLCJyb2xlcyI6WyJST0xFX1VTRVIiXSwibmlja05hbWUiOiLthYzsiqTtirgg7Jyg7KCAIDEiLCJpYXQiOjE2MDc5NTgzMjksImV4cCI6MTYwODU2MzEyOX0.K6UbEmoQhlD5Iv9piEC4gLSVk4c_ApafVCIK8Bfme4E"
}

Example response

HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/hal+json;charset=UTF-8
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
Strict-Transport-Security: max-age=31536000 ; includeSubDomains
X-Frame-Options: DENY
Content-Length: 234

{
  "accessToken" : "eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJUZXN0VXNlcjEiLCJyb2xlcyI6WyJST0xFX1VTRVIiXSwibmlja05hbWUiOiLthYzsiqTtirgg7Jyg7KCAIDEiLCJpYXQiOjE2MDc5NTgzMjksImV4cCI6MTYwNzk1ODkyOX0.PIsHiNLSCD-cmK4ShsDmdcMsuxtN4vAlM2eUepUAHoo"
}