본 문서는
본 REST API에서 사용하는 HTTP 동사(verbs)는 가능한한 표준 HTTP와 REST 규약을 따릅니다.
| 동사 | 용례 |
|---|---|
|
리소스를 가져올 때 사용 |
|
새 리소스를 만들 때 사용 |
|
기존 리소스를 수정할 때 사용 |
|
기존 리소스의 일부를 수정할 때 사용 |
|
기존 리소스를 삭제할 때 사용 |
본 REST API에서 사용하는 HTTP 상태 코드는 가능한한 표준 HTTP와 REST 규약을 따릅니다.
| 상태 코드 | 용례 |
|---|---|
|
요청을 성공적으로 처리함 |
|
새 리소스를 성공적으로 생성함.
응답의 |
|
기존 리소스를 성공적으로 수정함. |
|
잘못된 요청을 보낸 경우. 응답 본문에 더 오류에 대한 정보가 담겨있다. |
|
요청한 리소스가 없음. |
에러 응답이 발생했을 때 (상태 코드 >= 400), 본문에 해당 문제를 기술한 JSON 객체가 담겨있다. 에러 객체는 다음의 구조를 따른다.
| Path | Type | Description |
|---|---|---|
|
|
에러 코드 |
|
|
에러 원인 |
예를 들어, 존재하지 않는 이벤트를 조회하려 했을 때 다음과 같은 404 NOT FOUND 응답을 받는다.
HTTP/1.1 404 Not Found
Content-Type: application/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
X-Frame-Options: DENY
Content-Length: 77
{
"status" : 404,
"message" : "존재하지 않는 이벤트입니다."
}본 REST API는 하이퍼미디어와 사용하며 응답에 담겨있는 리소스는 다른 리소스에 대한 링크를 가지고 있다. 응답은 Hypertext Application from resource to resource. Language (HAL) 형식을 따른다. 링크는 `_links`라는 키로 제공한다. 본 API의 사용자(클라이언트)는 URI를 직접 생성하지 않아야 하며, 리소스에서 제공하는 링크를 사용해야 한다.
이벤트 리소스는 이벤트를 만들거나 조회할 때 사용한다.
POST 요청을 사용해서 새 이벤트를 만들 수 있다.
| Name | Description |
|---|---|
|
사용자 인증용 토큰 |
| Path | Type | Description |
|---|---|---|
|
|
이벤트 이름 |
|
|
이벤트 출발지 |
|
|
이벤트 도착지 |
|
|
이벤트 출발 시간 |
|
|
이벤트 도착 시간 |
|
|
이벤트 가격 |
|
|
이벤트 인원 |
$ curl 'http://localhost:8080/event' -i -X POST \
-H 'Content-Type: application/json;charset=UTF-8' \
-H 'X-AUTH-TOKEN: eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ0ZXN0QHRlc3QuY29tIiwiaWF0IjoxNjM1NDA4NDk4LCJleHAiOjE2MzU0MTAyOTh9.qpPuIF1hZ45IsSnjKhks_mWwDErP2U83_4S11tlWLjc' \
-d '{
"name" : "test",
"departure" : "Incheon",
"destination" : "Seoul",
"departureTime" : "2021-10-12T08:00:01",
"arrivalTime" : "2021-10-12T08:45:01",
"price" : 5000,
"totalNum" : 4
}'POST /event HTTP/1.1
Content-Type: application/json;charset=UTF-8
X-AUTH-TOKEN: eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ0ZXN0QHRlc3QuY29tIiwiaWF0IjoxNjM1NDA4NDk4LCJleHAiOjE2MzU0MTAyOTh9.qpPuIF1hZ45IsSnjKhks_mWwDErP2U83_4S11tlWLjc
Content-Length: 195
Host: localhost:8080
{
"name" : "test",
"departure" : "Incheon",
"destination" : "Seoul",
"departureTime" : "2021-10-12T08:00:01",
"arrivalTime" : "2021-10-12T08:45:01",
"price" : 5000,
"totalNum" : 4
}| Path | Type | Description |
|---|---|---|
|
|
응답 상태 |
|
|
응답 메시지 |
|
|
이벤트 id |
|
|
이벤트 이름 |
|
|
이벤트 출발지 |
|
|
이벤트 도착지 |
|
|
이벤트 출발시간 |
|
|
이벤트 도착시간 |
|
|
이벤트 가격 |
|
|
이벤트 참여 가능한 인원 |
|
|
이벤트 현재 참여 인원 |
|
|
이벤트 주인 id |
|
|
이벤트 참여자 id |
|
|
링크 이름 self: 자기 자신 |
|
|
링크 |
HTTP/1.1 200 OK
Content-Type: application/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
X-Frame-Options: DENY
Content-Length: 1016
{
"status" : 200,
"message" : "success",
"data" : {
"id" : 116,
"name" : "test",
"departure" : "Incheon",
"destination" : "Seoul",
"departureTime" : "2021-10-12T08:00:01",
"arrivalTime" : "2021-10-12T08:45:01",
"price" : 5000,
"totalNum" : 4,
"nowNum" : 1,
"host" : {
"id" : 115
},
"participants" : [ {
"id" : 115
} ],
"links" : [ {
"rel" : "profile",
"href" : "/docs/index.html#resources-events-create"
}, {
"rel" : "self",
"href" : "http://localhost:8080/event/116"
}, {
"rel" : "get-event",
"href" : "http://localhost:8080/event"
}, {
"rel" : "get-events-name",
"href" : "http://localhost:8080/event/name"
}, {
"rel" : "create-event",
"href" : "http://localhost:8080/event"
}, {
"rel" : "update-event",
"href" : "http://localhost:8080/event/116"
}, {
"rel" : "delete-event",
"href" : "http://localhost:8080/event/116"
} ]
}
}Get 요청을 사용해서 기존 이벤트 하나를 조회할 수 있다.
| Parameter | Description |
|---|---|
|
이벤트 id |
| Name | Description |
|---|---|
|
사용자 인증용 토큰 인증된 토큰이라면 인증시에 요청 가능한 링크 추가 제공 |
$ curl 'http://localhost:8080/event/127' -i -X GET \
-H 'Content-Type: application/json;charset=UTF-8' \
-H 'X-AUTH-TOKEN: eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ0ZXN0QHRlc3QuY29tIiwiaWF0IjoxNjM1NDA4NDk4LCJleHAiOjE2MzU0MTAyOTh9.qpPuIF1hZ45IsSnjKhks_mWwDErP2U83_4S11tlWLjc'GET /event/127 HTTP/1.1
Content-Type: application/json;charset=UTF-8
X-AUTH-TOKEN: eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ0ZXN0QHRlc3QuY29tIiwiaWF0IjoxNjM1NDA4NDk4LCJleHAiOjE2MzU0MTAyOTh9.qpPuIF1hZ45IsSnjKhks_mWwDErP2U83_4S11tlWLjc
Host: localhost:8080| Path | Type | Description |
|---|---|---|
|
|
응답 상태 |
|
|
응답 메시지 |
|
|
이벤트 id |
|
|
이벤트 이름 |
|
|
이벤트 출발지 |
|
|
이벤트 도착지 |
|
|
이벤트 출발시간 |
|
|
이벤트 도착시간 |
|
|
이벤트 가격 |
|
|
이벤트 참여 가능한 인원 |
|
|
이벤트 현재 참여 인원 |
|
|
이벤트 주인 id |
|
|
이벤트 참여자 id |
|
|
링크 이름 self: 자기 자신 |
|
|
링크 |
HTTP/1.1 200 OK
Content-Type: application/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
X-Frame-Options: DENY
Content-Length: 1008
{
"status" : 200,
"message" : "success",
"data" : {
"id" : 127,
"name" : "test",
"departure" : "Incheon",
"destination" : "Seoul",
"departureTime" : "2021-10-12T08:00:01",
"arrivalTime" : "2021-10-12T08:45:01",
"price" : 5000,
"totalNum" : 4,
"nowNum" : 1,
"host" : {
"id" : 126
},
"participants" : [ {
"id" : 126
} ],
"links" : [ {
"rel" : "profile",
"href" : "/docs/index.html#resources-event"
}, {
"rel" : "self",
"href" : "http://localhost:8080/event/127"
}, {
"rel" : "get-event",
"href" : "http://localhost:8080/event"
}, {
"rel" : "get-events-name",
"href" : "http://localhost:8080/event/name"
}, {
"rel" : "create-event",
"href" : "http://localhost:8080/event"
}, {
"rel" : "update-event",
"href" : "http://localhost:8080/event/127"
}, {
"rel" : "delete-event",
"href" : "http://localhost:8080/event/127"
} ]
}
}GET 요청을 사용하여 서비스의 모든 이벤트를 조회할 수 있다.
| Parameter | Description |
|---|---|
|
이벤트 이름 |
| Name | Description |
|---|---|
|
사용자 인증용 토큰 인증된 토큰이라면 인증시에 요청 가능한 링크 추가 제공 |
| Parameter | Description |
|---|---|
|
요청 페이지 페이지는 0부터 시작 |
|
페이지 당 이벤트 개수 |
$ curl 'http://localhost:8080/event/name/test?page=0&size=10' -i -X GET \
-H 'Content-Type: application/json;charset=UTF-8' \
-H 'X-AUTH-TOKEN: eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ0ZXN0QHRlc3QuY29tIiwiaWF0IjoxNjM1NDA4NDk3LCJleHAiOjE2MzU0MTAyOTd9.69au6aHzXTAZwOMs-vjeM_XTBfTocOmfkvkRFVMApUw'GET /event/name/test?page=0&size=10 HTTP/1.1
Content-Type: application/json;charset=UTF-8
X-AUTH-TOKEN: eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ0ZXN0QHRlc3QuY29tIiwiaWF0IjoxNjM1NDA4NDk3LCJleHAiOjE2MzU0MTAyOTd9.69au6aHzXTAZwOMs-vjeM_XTBfTocOmfkvkRFVMApUw
Host: localhost:8080| Path | Type | Description |
|---|---|---|
|
|
응답 상태 |
|
|
응답 메시지 |
|
|
이벤트 목록 |
|
|
링크 이름 first: 첫 페이지 |
|
|
링크 |
|
|
페이지 당 이벤트 수 |
|
|
전체 이벤트 수 |
|
|
전체 페이지 수 |
|
|
전체 페이지 번호 |
HTTP/1.1 200 OK
Content-Type: application/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
X-Frame-Options: DENY
Content-Length: 5501
{
"status" : 200,
"message" : "success",
"data" : {
"links" : [ {
"rel" : "first",
"href" : "http://localhost:8080/event/name/test?page=0&size=10"
}, {
"rel" : "self",
"href" : "http://localhost:8080/event/name/test?page=0&size=10"
}, {
"rel" : "next",
"href" : "http://localhost:8080/event/name/test?page=1&size=10"
}, {
"rel" : "last",
"href" : "http://localhost:8080/event/name/test?page=10&size=10"
}, {
"rel" : "profile",
"href" : "/docs/index.html#resources-events-list"
}, {
"rel" : "create-event",
"href" : "http://localhost:8080/event"
} ],
"content" : [ {
"id" : 5,
"name" : "test",
"departure" : "Incheon",
"destination" : "Seoul",
"departureTime" : "2021-10-12T08:00:01",
"arrivalTime" : "2021-10-12T08:45:01",
"price" : 5000,
"totalNum" : 4,
"nowNum" : 1,
"host" : {
"id" : 4
},
"participants" : [ {
"id" : 4
} ],
"links" : [ {
"rel" : "self",
"href" : "http://localhost:8080/event/5"
} ]
}, {
"id" : 6,
"name" : "test0",
"departure" : "Incheon0",
"destination" : "Seoul0",
"departureTime" : "2021-10-12T08:00:01",
"arrivalTime" : "2021-10-12T08:45:01",
"price" : 5000,
"totalNum" : 4,
"nowNum" : 1,
"host" : {
"id" : 4
},
"participants" : [ {
"id" : 4
} ],
"links" : [ {
"rel" : "self",
"href" : "http://localhost:8080/event/6"
} ]
}, {
"id" : 7,
"name" : "test1",
"departure" : "Incheon1",
"destination" : "Seoul1",
"departureTime" : "2021-10-12T08:00:01",
"arrivalTime" : "2021-10-12T08:45:01",
"price" : 5000,
"totalNum" : 4,
"nowNum" : 1,
"host" : {
"id" : 4
},
"participants" : [ {
"id" : 4
} ],
"links" : [ {
"rel" : "self",
"href" : "http://localhost:8080/event/7"
} ]
}, {
"id" : 8,
"name" : "test2",
"departure" : "Incheon2",
"destination" : "Seoul2",
"departureTime" : "2021-10-12T08:00:01",
"arrivalTime" : "2021-10-12T08:45:01",
"price" : 5000,
"totalNum" : 4,
"nowNum" : 1,
"host" : {
"id" : 4
},
"participants" : [ {
"id" : 4
} ],
"links" : [ {
"rel" : "self",
"href" : "http://localhost:8080/event/8"
} ]
}, {
"id" : 9,
"name" : "test3",
"departure" : "Incheon3",
"destination" : "Seoul3",
"departureTime" : "2021-10-12T08:00:01",
"arrivalTime" : "2021-10-12T08:45:01",
"price" : 5000,
"totalNum" : 4,
"nowNum" : 1,
"host" : {
"id" : 4
},
"participants" : [ {
"id" : 4
} ],
"links" : [ {
"rel" : "self",
"href" : "http://localhost:8080/event/9"
} ]
}, {
"id" : 10,
"name" : "test4",
"departure" : "Incheon4",
"destination" : "Seoul4",
"departureTime" : "2021-10-12T08:00:01",
"arrivalTime" : "2021-10-12T08:45:01",
"price" : 5000,
"totalNum" : 4,
"nowNum" : 1,
"host" : {
"id" : 4
},
"participants" : [ {
"id" : 4
} ],
"links" : [ {
"rel" : "self",
"href" : "http://localhost:8080/event/10"
} ]
}, {
"id" : 11,
"name" : "test5",
"departure" : "Incheon5",
"destination" : "Seoul5",
"departureTime" : "2021-10-12T08:00:01",
"arrivalTime" : "2021-10-12T08:45:01",
"price" : 5000,
"totalNum" : 4,
"nowNum" : 1,
"host" : {
"id" : 4
},
"participants" : [ {
"id" : 4
} ],
"links" : [ {
"rel" : "self",
"href" : "http://localhost:8080/event/11"
} ]
}, {
"id" : 12,
"name" : "test6",
"departure" : "Incheon6",
"destination" : "Seoul6",
"departureTime" : "2021-10-12T08:00:01",
"arrivalTime" : "2021-10-12T08:45:01",
"price" : 5000,
"totalNum" : 4,
"nowNum" : 1,
"host" : {
"id" : 4
},
"participants" : [ {
"id" : 4
} ],
"links" : [ {
"rel" : "self",
"href" : "http://localhost:8080/event/12"
} ]
}, {
"id" : 13,
"name" : "test7",
"departure" : "Incheon7",
"destination" : "Seoul7",
"departureTime" : "2021-10-12T08:00:01",
"arrivalTime" : "2021-10-12T08:45:01",
"price" : 5000,
"totalNum" : 4,
"nowNum" : 1,
"host" : {
"id" : 4
},
"participants" : [ {
"id" : 4
} ],
"links" : [ {
"rel" : "self",
"href" : "http://localhost:8080/event/13"
} ]
}, {
"id" : 14,
"name" : "test8",
"departure" : "Incheon8",
"destination" : "Seoul8",
"departureTime" : "2021-10-12T08:00:01",
"arrivalTime" : "2021-10-12T08:45:01",
"price" : 5000,
"totalNum" : 4,
"nowNum" : 1,
"host" : {
"id" : 4
},
"participants" : [ {
"id" : 4
} ],
"links" : [ {
"rel" : "self",
"href" : "http://localhost:8080/event/14"
} ]
} ],
"page" : {
"size" : 10,
"totalElements" : 101,
"totalPages" : 11,
"number" : 0
}
}
}PUT 요청을 사용해서 기존 이벤트를 수정할 수 있다.
| Parameter | Description |
|---|---|
|
이벤트 id |
| Name | Description |
|---|---|
|
사용자 인증용 토큰 |
| Path | Type | Description |
|---|---|---|
|
|
이벤트 이름 |
|
|
이벤트 출발지 |
|
|
이벤트 도착지 |
|
|
이벤트 출발 시간 |
|
|
이벤트 도착 시간 |
|
|
이벤트 가격 |
|
|
이벤트 인원 |
|
|
이벤트 주인 id |
|
|
이벤트 참여자 id |
$ curl 'http://localhost:8080/event/113' -i -X PUT \
-H 'Content-Type: application/json;charset=UTF-8' \
-H 'X-AUTH-TOKEN: eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ0ZXN0QHRlc3QuY29tIiwiaWF0IjoxNjM1NDA4NDk4LCJleHAiOjE2MzU0MTAyOTh9.qpPuIF1hZ45IsSnjKhks_mWwDErP2U83_4S11tlWLjc' \
-d '{
"name" : "after",
"departure" : "after dep",
"destination" : "after dest",
"departureTime" : "2021-10-12T08:00:01",
"arrivalTime" : "2021-10-12T08:45:01",
"price" : 5000,
"totalNum" : 4,
"host_id" : 114,
"participants_id" : [ 114 ]
}'PUT /event/113 HTTP/1.1
Content-Type: application/json;charset=UTF-8
X-AUTH-TOKEN: eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ0ZXN0QHRlc3QuY29tIiwiaWF0IjoxNjM1NDA4NDk4LCJleHAiOjE2MzU0MTAyOTh9.qpPuIF1hZ45IsSnjKhks_mWwDErP2U83_4S11tlWLjc
Content-Length: 253
Host: localhost:8080
{
"name" : "after",
"departure" : "after dep",
"destination" : "after dest",
"departureTime" : "2021-10-12T08:00:01",
"arrivalTime" : "2021-10-12T08:45:01",
"price" : 5000,
"totalNum" : 4,
"host_id" : 114,
"participants_id" : [ 114 ]
}| Path | Type | Description |
|---|---|---|
|
|
응답 상태 |
|
|
응답 메시지 |
|
|
이벤트 id |
|
|
이벤트 이름 |
|
|
이벤트 출발지 |
|
|
이벤트 도착지 |
|
|
이벤트 출발시간 |
|
|
이벤트 도착시간 |
|
|
이벤트 가격 |
|
|
이벤트 참여 가능한 인원 |
|
|
이벤트 현재 참여 인원 |
|
|
이벤트 주인 id |
|
|
이벤트 참여자 id |
|
|
링크 이름 self: 자기 자신 |
|
|
링크 |
HTTP/1.1 200 OK
Content-Type: application/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
X-Frame-Options: DENY
Content-Length: 848
{
"status" : 200,
"message" : "success",
"data" : {
"id" : 113,
"name" : "after",
"departure" : "after dep",
"destination" : "after dest",
"departureTime" : "2021-10-12T08:00:01",
"arrivalTime" : "2021-10-12T08:45:01",
"price" : 5000,
"totalNum" : 4,
"nowNum" : 1,
"host" : {
"id" : 114
},
"participants" : [ {
"id" : 114
} ],
"links" : [ {
"rel" : "profile",
"href" : "/docs/index.html#resources-events-update"
}, {
"rel" : "self",
"href" : "http://localhost:8080/event/113"
}, {
"rel" : "get-event",
"href" : "http://localhost:8080/event"
}, {
"rel" : "get-events-name",
"href" : "http://localhost:8080/event/name"
}, {
"rel" : "create-event",
"href" : "http://localhost:8080/event"
} ]
}
}Delete 요청을 사용해서 기존 이벤트 하나를 삭제할 수 있다.
| Parameter | Description |
|---|---|
|
이벤트 id |
| Name | Description |
|---|---|
|
사용자 인증용 토큰 인증된 토큰이라면 인증시에 요청 가능한 링크 추가 제공 |
$ curl 'http://localhost:8080/event/3' -i -X DELETE \
-H 'Content-Type: application/json;charset=UTF-8' \
-H 'X-AUTH-TOKEN: eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ0ZXN0QHRlc3QuY29tIiwiaWF0IjoxNjM1NDA4NDk3LCJleHAiOjE2MzU0MTAyOTd9.69au6aHzXTAZwOMs-vjeM_XTBfTocOmfkvkRFVMApUw'DELETE /event/3 HTTP/1.1
Content-Type: application/json;charset=UTF-8
X-AUTH-TOKEN: eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ0ZXN0QHRlc3QuY29tIiwiaWF0IjoxNjM1NDA4NDk3LCJleHAiOjE2MzU0MTAyOTd9.69au6aHzXTAZwOMs-vjeM_XTBfTocOmfkvkRFVMApUw
Host: localhost:8080| Path | Type | Description |
|---|---|---|
|
|
응답 상태 |
|
|
응답 메시지 |
|
|
링크 이름 self: 자기 자신 |
|
|
링크 |
HTTP/1.1 200 OK
Content-Type: application/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
X-Frame-Options: DENY
Content-Length: 429
{
"status" : 200,
"message" : "success",
"data" : {
"links" : [ {
"rel" : "profile",
"href" : "/docs/index.html#resources-events-delete"
}, {
"rel" : "get-event",
"href" : "http://localhost:8080/event"
}, {
"rel" : "get-events-name",
"href" : "http://localhost:8080/event/name"
}, {
"rel" : "create-event",
"href" : "http://localhost:8080/event"
} ]
}
}