개요
HTTP 동사
본 REST API에서 사용하는 HTTP 동사(verbs)는 가능한한 표준 HTTP와 REST 규약을 따릅니다.
동사 | 용례 |
---|---|
|
리소스를 가져올 때 사용 |
|
새 리소스를 만들 때 사용 |
|
기존 리소스를 수정할 때 사용 |
|
기존 리소스의 일부를 수정할 때 사용 |
|
기존 리소스를 삭제할 떄 사용 |
HTTP 상태 코드
본 REST API에서 사용하는 HTTP 상태 코드는 가능한한 표준 HTTP와 REST 규약을 따릅니다.
상태 코드 | 용례 |
---|---|
|
요청을 성공적으로 처리함 |
|
새 리소스를 성공적으로 생성함. 응답의 |
|
기존 리소스를 성공적으로 수정함. |
|
잘못된 요청을 보낸 경우. 응답 본문에 더 오류에 대한 정보가 담겨있다. |
|
요청한 리소스가 없음. |
오류
에러 응답이 발생했을 때 (상태 코드 >= 400), 본문에 해당 문제를 기술한 JSON 객체가 담겨있다.
Auth Error
Error0001
Response body
{
"timestamp" : "2020-10-02T22:50:18.7902702",
"status" : 202,
"error" : "0001",
"message" : "ID: TestUser1 이미 사용중인 아이디입니다."
}
Error0002
Response body
{
"timestamp" : "2020-10-02T22:50:16.6159715",
"status" : 403,
"error" : "0002",
"message" : "ID: TestUser1 회원가입이 되어있지 않거나 잠긴 계정입니다."
}
Error0003
Response body
{
"timestamp" : "2020-10-02T22:50:14.8562847",
"status" : 403,
"error" : "0003",
"message" : "유효하지 않은 토큰입니다."
}
Error0004
Response body
{
"timestamp" : "2020-10-02T22:50:14.9646203",
"status" : 403,
"error" : "0004",
"message" : "손상된 토큰입니다."
}
Error0005
Response body
{
"timestamp" : "2020-10-02T22:50:12.8269885",
"status" : 403,
"error" : "0005",
"message" : "잘못된 인증입니다."
}
Error0006
Response body
{
"timestamp" : "2020-10-02T22:50:12.6952261",
"status" : 403,
"error" : "0006",
"message" : "만료된 토큰입니다."
}
Community Error
Error1001
Response body
{
"timestamp" : "2020-10-02T22:49:54.2290311",
"status" : 400,
"error" : "1001",
"message" : "존재하지 않거나 수정 권한이 없습니다."
}
Post Error
Error1101
Response body
{
"timestamp" : "2020-10-02T22:49:54.8660554",
"status" : 404,
"error" : "1101",
"message" : "존재하지 않는 게시글입니다."
}
System Error
Error2001
Response body
{
"timestamp" : "2020-10-02T22:49:50.6524271",
"status" : 400,
"error" : "2001",
"message" : "Unrecognized field \"message\" "
}
하이퍼미디어
본 REST API는 하이퍼미디어와 사용하며 응답에 담겨있는 리소스는 다른 리소스에 대한 링크를 가지고 있다. 응답은 Hypertext Application from resource to resource. Language (HAL) 형식을 따른다. 링크는 `_links`라는 키로 제공한다. 본 API의 사용자(클라이언트)는 URI를 직접 생성하지 않아야 하며, 리소스에서 제공하는 링크를 사용해야 한다.
인증하기
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
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: 380
{
"accessToken" : "eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJUZXN0VXNlcjEiLCJyb2xlcyI6WyJST0xFX1VTRVIiXSwiaWF0IjoxNjAxNjQ2NjE2LCJleHAiOjE2MDE2NDcyMTZ9.futR0hYXRxFZlFNx3oygo75JUzBK07JxK5FN5-Xl7zU",
"refreshToken" : "eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJUZXN0VXNlcjEiLCJyb2xlcyI6WyJST0xFX1VTRVIiXSwiaWF0IjoxNjAxNjQ2NjE2LCJleHAiOjE2MDIyNTE0MTZ9.bhb8fwGoCH1fqpnYzHnTry8R9ctTsNF1PXqay2Fw5ds"
}
회원가입하기
Post
요청을 사용해서 회원가입을 할 수있다.
HTTP request
POST /auth/signup HTTP/1.1
Content-Type: application/json;charset=UTF-8
Content-Length: 88
Host: templet.restapi.com
{
"id" : "TestUser1",
"password" : "Password",
"name" : "테스트 유저 1"
}
Example response
HTTP/1.1 200 OK
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: 380
{
"accessToken" : "eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJUZXN0VXNlcjEiLCJyb2xlcyI6WyJST0xFX1VTRVIiXSwiaWF0IjoxNjAxNjQ2NjE4LCJleHAiOjE2MDE2NDcyMTh9.QUPPZeRPDwtZXc-5i22areROEz64kyfQVbLpXeLSnm4",
"refreshToken" : "eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJUZXN0VXNlcjEiLCJyb2xlcyI6WyJST0xFX1VTRVIiXSwiaWF0IjoxNjAxNjQ2NjE4LCJleHAiOjE2MDIyNTE0MTh9.GLwgWBQgf64aDD03tmNcXtHBgcu7VJ0gbgncKp55r_A"
}
회원가입하기
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
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
사용가능한 아이디입니다.
게시글 목록 조회
Get
요청을 사용해서 게시글 목록을 조회 할 수 있다.
HTTP request
GET /board/posts?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
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: 1469
{
"_embedded" : {
"postList" : [ {
"postId" : 5,
"title" : "게시글4",
"writerId" : "TestUser4",
"views" : 0,
"commentNum" : 0,
"modifiedDate" : "2020-10-02T22:50:05.658172",
"_links" : {
"self" : {
"href" : "https://templet.restapi.com/board/posts/5"
}
}
}, {
"postId" : 4,
"title" : "게시글3",
"writerId" : "TestUser3",
"views" : 0,
"commentNum" : 0,
"modifiedDate" : "2020-10-02T22:50:05.574237",
"_links" : {
"self" : {
"href" : "https://templet.restapi.com/board/posts/4"
}
}
} ]
},
"_links" : {
"first" : {
"href" : "https://templet.restapi.com/board/posts?page=0&size=2&sort=title,desc"
},
"prev" : {
"href" : "https://templet.restapi.com/board/posts?page=0&size=2&sort=title,desc"
},
"self" : {
"href" : "https://templet.restapi.com/board/posts?page=1&size=2&sort=title,desc"
},
"next" : {
"href" : "https://templet.restapi.com/board/posts?page=2&size=2&sort=title,desc"
},
"last" : {
"href" : "https://templet.restapi.com/board/posts?page=2&size=2&sort=title,desc"
},
"profile" : {
"href" : "https://templet.restapi.com/docs/index.html#getPosts"
}
},
"page" : {
"size" : 2,
"totalElements" : 6,
"totalPages" : 3,
"number" : 1
}
}
게시글 작성
Post
요청을 사용해서 게시글을 작성 할 수 있다.
HTTP request
POST /board/posts HTTP/1.1
Content-Type: application/json;charset=UTF-8
Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJUZXN0VXNlcjEiLCJyb2xlcyI6WyJST0xFX1VTRVIiXSwiaWF0IjoxNjAxNjQ2NjA4LCJleHAiOjE2MDE2NDcyMDh9.LhJ93EfR0V6eK5ETzcpkwfvpg3eDX01WznQHBcfo4y8
Content-Length: 88
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
Location: https://templet.restapi.com/board/posts/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: 206
{
"_links" : {
"self" : {
"href" : "https://templet.restapi.com/board/posts/1"
},
"profile" : {
"href" : "https://templet.restapi.com/docs/index.html#sendPost"
}
}
}
게시글 조회
Get
요청을 사용해서 게시글을 조회 할 수 있다.
Path parameters
Parameter | Description |
---|---|
|
게시글 아이디 |
HTTP request
GET /board/posts/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
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: 1561
{
"title" : "게시글1",
"writerId" : "TestUser1",
"body" : "게시글 본문입니다.",
"views" : 1,
"createdDate" : "2020-10-02T22:50:05.0309156",
"modifiedDate" : "2020-10-02T22:50:05.0309156",
"comments" : [ {
"commentId" : 1,
"message" : "2번째 댓글",
"commenterId" : "TestUser2",
"createdDate" : "2020-10-02T22:50:05.123636",
"modifiedDate" : "2020-10-02T22:50:05.123636",
"_links" : {
"self" : {
"href" : "https://templet.restapi.com/board/posts/1"
},
"updateComment" : {
"href" : "https://templet.restapi.com/board/posts/1"
},
"deleteComment" : {
"href" : "https://templet.restapi.com/board/posts/1"
}
}
}, {
"commentId" : 2,
"message" : "3번째 댓글",
"commenterId" : "TestUser3",
"createdDate" : "2020-10-02T22:50:05.2163657",
"modifiedDate" : "2020-10-02T22:50:05.2163657",
"_links" : {
"self" : {
"href" : "https://templet.restapi.com/board/posts/2"
},
"updateComment" : {
"href" : "https://templet.restapi.com/board/posts/2"
},
"deleteComment" : {
"href" : "https://templet.restapi.com/board/posts/2"
}
}
} ],
"_links" : {
"self" : {
"href" : "https://templet.restapi.com/board/posts/1"
},
"sendComment" : {
"href" : "https://templet.restapi.com/board/posts/1"
},
"profile" : {
"href" : "https://templet.restapi.com/docs/index.html#getPost"
}
}
}
게시글 수정
Put
요청을 사용해서 게시글을 수정 할 수 있다.
Path parameters
Parameter | Description |
---|---|
|
게시글 아이디 |
HTTP request
PUT /board/posts/2 HTTP/1.1
Content-Type: application/json;charset=UTF-8
Content-Length: 91
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
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/board/posts/2"
},
"profile" : {
"href" : "https://templet.restapi.com/docs/index.html#updatePost"
}
}
}
게시글 삭제
Delete
요청을 사용해서 게시글을 삭제 할 수 있다.
Path parameters
Parameter | Description |
---|---|
|
게시글 아이디 |
HTTP request
DELETE /board/posts/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
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/board/posts/1"
},
"profile" : {
"href" : "https://templet.restapi.com/docs/index.html#deletePost"
}
}
}
댓글 작성
Post
요청을 사용해서 댓글을 작성 할 수 있다.
Path parameters
Parameter | Description |
---|---|
|
게시글 번호 |
HTTP request
POST /board/posts/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
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: 209
{
"_links" : {
"self" : {
"href" : "https://templet.restapi.com/board/posts/1"
},
"profile" : {
"href" : "https://templet.restapi.com/docs/index.html#sendComment"
}
}
}
댓글 수정
Put
요청을 사용해서 댓글을 수정 할 수 있다.
Path parameters
Parameter | Description |
---|---|
|
게시글 번호 |
|
댓글 번호 |
HTTP request
PUT /board/posts/2/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
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: 211
{
"_links" : {
"self" : {
"href" : "https://templet.restapi.com/board/posts/2"
},
"profile" : {
"href" : "https://templet.restapi.com/docs/index.html#updateComment"
}
}
}
댓글 삭제
Delete
요청을 사용해서 댓글을 삭제 할 수 있다.
Path parameters
Parameter | Description |
---|---|
|
게시글 번호 |
|
댓글 번호 |
HTTP request
DELETE /board/posts/3/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
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: 211
{
"_links" : {
"self" : {
"href" : "https://templet.restapi.com/board/posts/3"
},
"profile" : {
"href" : "https://templet.restapi.com/docs/index.html#deleteComment"
}
}
}