API 개념 공부
by choising
Rest API
- API(Application Programming Interface)
- 응용 프로그램 프로그래밍 인터페이스
- 응용 프로그램에서 사용할 수 있도록, 운영 체제나 프로그래밍 언어가 제공하는 기능을 제어할 수 있게 만든 인터페이스
- 쉽게 말해, 어떠한 메소드(기능)를 사용할 때 그 내부 구현을 모르고도 인터페이스만 알면 사용할 수 있다.
- 이렇게 제공하는 것을 API라 한다.
- Mashup
- API들을 조합한 어플레케이션.
- REST
- REpresentational State Transfer
- REST API
- REST형식의 API
- 핵심 컨텐츠 및 기능을 외부 사이트에서 활용할 수 있도록 제공되는 인터페이스.
- 아래의 스타일을 지켜야 REST API 이다.
- Client - Server
- Stateless
- Cache
- Uniform interface
- Layered System
- Code-on-demand (optional)
-
HTTP 프로토콜을 준수한다면 uniform interface를 제외하고 전부 쉽게 구현 가능하다.
- Uniform interface
- 리소스가 URI로 식별되야 함.
- 리소스를 생성, 수정, 추가하고자 할 때 HTTP 메시지에 표현해서 전송해야 함.
- 메시지는 스스로 설명할 수 있어야 함.(Self-descriptive Message)
- 어플리케이션의 상태는 Hyperlink를 이용해 전이되어야 함. (HATEOAS)
- 메시지가 스스로 설명할 수 있어야 하는 부분, HATEOAS를 지원하는 것은 어렵다.
- 응답 결과에 보통 JSON 메시지를 사용하는데 이 JSON메시지가 어디에 전달되고 구성이 어떤 의미인지 표현해야 스스로 설명할 수 있다고 말할 수 있는데 그게 어렵다.
- REST API는 쉽지 않기에 많은 서비스가 REST에서 바라는 것을 모두 지원하지는 않고 API를 만들게 된다.
- 모든 것을 준수하지 않지만 REST API라 말하는 경우도 존재.
- 모든 것을 준수하지 않으면 Web API, HTTP API 라고 부르는 경우도 존재.
Web API
- URI는 정보의 자원을 표현해야 한다.
- 자원에 대한 행위는 HTTP Method(GET, POST, PUT, DELETE)로 표현한다.
Method | DESC |
---|---|
POST | POST를 통해 해당 URI를 요청하면 리소스를 생성. |
GET | GET을 통해 해당 리소스를 조회. 리소스를 조회하고 해당 도큐먼트에 대한 자세한 정보를 가져온다. |
PUT | PUT을 통해 리소스를 수정한다. |
DELETE | DELETE를 통해 리소스를 삭제한다. |
- GET /members
- 멤버의 모든 정보를 요청.
GET /members/delete/1- 위와 같이 동사로 삭제를 표현하면 안된다.
- GET은 정보를 요청할 때 사용해야한다.
- DELETE /members/1
- HTTP Method 중 하나인 DELETE를 이용하여 삭제를 표현.
- members중 1에 해당하는 것을 삭제.
- 슬래시 구분자(/)는 계층을 나타낼 때 사용.
- http://domain/houses/apartments
- house들 중에서 apartment.
- http://domain/departments/1/employees
- 모든 부서 중에서 1번 부서의 사원들.
- http://domain/houses/apartments
- URI 마지막 문자로 슬래시 구분자(/)를 포함하지 않는다.
- 하이픈(-)은 URI가독성을 높일 때 사용
- 언더바(_)는 사용하지 않는다.
- URI경로는 소문자만 사용한다.
- URI의 문법형식인 RFC 3986은 URI스키마와 호스트를 제외하고는 대소문자를 구별한다.
- 파일 확장자는 URI에 포함시키지 않는다.
- Accept Header를 사용.
- 상태코드
상태코드 | DESC |
---|---|
200 | 클라이언트의 요청을 정상적으로 수행함 |
201 | POST를 통한 리소스 생성 작업 시 클라이언트가 요청한 해당 리소스가 성공적으로 생성됨 |
301 | 클라이언트가 요청한 리소스에 대한 URI가 변경 되었을 때 응답 시 Location header에 변경된 URI를 명시 |
400 | 클라이언트의 요청이 부적절 할 경우 |
401 | 클라이언트가 인증되지 않은 상태에서 보호된 리소스를 요청 시 |
403 | 유저 인증상태와 관계 없이 응답하고 싶지 않은 리소스를 클라이언트가 요청했을 때 |
403보다는 400이나 404를 사용할 것을 권고, 403 자체가 리소스가 존재한다는 뜻이기 때문 | |
405 | 클라이언트가 요청한 리소스에서는 사용 불가능한 Method를 이용했을 경우 |
500 | 서버에 문제가 있을 경우 |
JDBC와 Servlet을 이용한 Web API 작성
- db table의 리소스에 접근하는 servlet을 구현.
- 리소스를 JSON 형태로 출력.
- GET /roles
- Select.
- POST /roles
- Insert.
- PUT /roles
- Update.
- DELETE /roles
- Delete.
- jackson lib가 제공하는 ObjectMapper 객체
- JSON 문자열로 바꾸거나, JSON문자열을 객체로 바꾸는 역할을 수행.
- writeValueAsString Method(Object param)
- parameter에 list를 넣으면 해당 list를 JSON으로 변경하여 return 한다.
- uri로 role_id 정보를 받아 결과를 출력하는 servlet 예시.
@WebServlet("/roles/*")
public class RolebyIdServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public RolebyIdServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
response.setCharacterEncoding("utf-8");
response.setContentType("application/json");
String pathInfo = request.getPathInfo(); // /roles/{roleId}
String[] pathParts = pathInfo.split("/");
String idStr = pathParts[1];
int id = Integer.parseInt(idStr);
RoleDao dao = new RoleDao();
Role role = dao.getRole(id);
ObjectMapper objectMapper = new ObjectMapper();
String json = objectMapper.writeValueAsString(role);
PrintWriter out = response.getWriter();
out.println(json);
out.close();
}
}
-
uri 호출 시.
-
mysql select 결과.
Subscribe via RSS