일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 최소공배수
- python
- 완전 탐색
- 에라토스테네스의 체
- 영문자 확인
- 보이어무어
- 메뉴리뉴얼
- 튜플
- 반복문
- 규칙찾기
- Stack
- 문자열
- 동적계획법
- dfs
- 알고리즘
- 어려웠던 문제
- Dynamic Programming
- 완전탐색
- 순열
- HashSet
- 조합
- 쿼드압축 후 개수세기
- 2017 카카오 코드
- fragment identifier
- 프로그래머스
- 후위 표기법
- pandas
- Java
- 점프와 순간이동
- HashMap
- Today
- Total
csmoon1010의 SW 블로그
WEB API - (부스트코스) 본문
1. API
Application Programming Interface
- 응용 프로그램에서 사용할 수 있도록, 운영체제나 프로그래밍 언어가 제공하는 기능(파일제어, 창제어, 화상 처리, 문자제어 등)을 제어할 수 있게 만든 인터페이스
- 내부 구현코드를 알지 못해도 "인터페이스"만 알면 사용이 가능
==================================================================
⭐ REST API, WEB API의 디자인 가이드 핵심 ⭐
① URI로 정보의 자원을 표현한다. (행위 관련 표현이 들어가면 X)
② HTTP Method (GET, POST, PUT, DELETE)로 자원에 대한 행위를 표현한다.
ex> 회원정보 가져오기 : GET /members/1
==================================================================
2. REST API
REpresentational State Transfer API
핵심 컨텐츠 및 기능을 외부 사이트에서 활용할 수 있도록 제공되는 인터페이스
1) REST의 스타일(제약조건)
- Client-Server : 클라이언트, 서버의 역할이 확실히 구분되어 의존성↓
- Stateless : 상태정보 저장, 관리 X → 구현의 단순함
- Cacheable : HTTP가 가진 캐싱 기능 적용 가능
- Uniform Interface
- Layered System : 다중 계층 + 보안/로드 밸런싱/암호화 계층 + 네트워크 기반 중간매체
- code-on-demand (optional)
2) uniform interface
- 리소스가 URI로 식별되야 함
- 리소스의 생성,수정,추가 : HTTP메시지에 표현하여 전송
- 메시지는 스스로 설명 가능해야 함 (Self-descriptive message)
※ JSON 메시지에 전달 목적지, 구성 의미를 표현하는 것이 어렵 - 애플리케이션의 상태 : Hyperlink를 이용해 전이(HATEOAS)
※ HATEOAS : 웹 페이지 자체와 관련된 링크가 있는 것 BUT 쉽지 않음
⇨ Self-descriptive message와 HATEOAS 등 어려운 제약조건을 제외한 API = Web API 혹은 HTTP API
3) URI 설계 방법 (WEP API도 해당)
- 슬래시 구분자(/) : 계층 관계 표현
ex> http://restapi.example.com/animals/mammals/whales - 마지막 문자 : 슬래시(/) 포함하지 않음
- 리소스를 분명하게 구분할 수 있도록 - 하이픈(-) : URI의 가독성을 높이는 용도로 사용
- 밑줄(_) : URI에 사용하지 않음. 대신 하이픈을 사용하기
- 소문자 : 대소문자를 구분하므로 소문자로 통일 (RFC 3986 URI 문법 형식에 따라)
- 파일 확장자 : 포함시키지 않기. Accept header를 대신 이용하기!
ex> GET /members/soccer/345/photo HTTP/1.1 Host: restapi.example.com Accept: image/jpg - /리소스명/리소스 ID/관계가 있는 다른 리소스명 으로 리소스 간 연관 관계를 표현
ex> GET /users/userid/devices (소유의 관계) GET /users/userid/likes/devices (좋아하는 디바이스 목록) - Collection과 Document를 계층 구조로 표현
ex> 'sports', 'players' (Collection) & 'soccer', '13' (Document) → GET /sports/soccer/players/13
4) HTTP 상태코드 (WEB API도 해당)
(1) 성공 : 2XX
(2) 클라이언트로 인한 오류 : 4XX
++ 404 : Not Found - 서버가 클라이언트에서 요청한 페이지(resource)를 찾을 수 없을 때
(3) 서버로 인한 오류
3. Web API
1) 사용 라이브러리
- mysql-connector-java
- jackson-databind : json 형태의 데이터를 사용하기 위해
- javax.servlet-api : 서블릿
- jstl
2) 예시 - url path에 있는 id에 해당하는 데이터를 json으로 출력
package kr.or.connect.webapiexam.api;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.fasterxml.jackson.databind.ObjectMapper;
import kr.or.connect.jdbcexam.dao.RoleDao;
import kr.or.connect.jdbcexam.dto.Role;
@WebServlet("/roles/*")
public class RoleByIdServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public RoleByIdServlet() {
super();
// TODO Auto-generated constructor stub
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
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();
}
}
- @WebServlet("/roles/*") : roles 뒤에 오는 모든 roleId 에 대하여 처리
- request.getPathInfo() : request로 들어온 url의 path 처리 → split을 통해 원하는 정보 추출
- ObjectMapper : Json 문자열로 바꾸거나 Json을 객체로 바꾸는 역할
※ REST API 참고 : meetup.toast.com/posts/92
'웹 > 백엔드' 카테고리의 다른 글
Spring JDBC - (부스트코스) (0) | 2021.04.11 |
---|---|
Spring Core - (부스트코스) (0) | 2021.04.11 |
JDBC - (부스트코스) (0) | 2021.04.08 |
Maven - (부스트코스) (0) | 2021.04.08 |
JSP의 JSTL & EL - (부스트코스) (0) | 2021.04.05 |