반응형

 

 

 

 

 

 

 

1. Web API 디자인 가이드

  • URI는 정보의 자원을 표현해야 합니다.
  • 자원에 대한 행위는 HTTP Method(GET, POST, PUT, DELETE)로 표현합니다.

 

 

자원에 대한 행위는 HTTP Method로 표현

 

 

 

 

2. URI는 정보의 자원을 표현해야 한다.

  • GET /members
    : 위의 표현은 맴버의 모든 정보를 달라는 요청입니다.
  • GET /members/delete/1
    : GET은 정보를 요청할 때 사용합니다. 위와 같이 동사로 삭제를 표현하면 안 됩니다.
  • DELETE /members/1
    : HTTP Method 중의 하나인 DELETE를 이용하여 삭제를 표현해야 합니다.

 

3. 자원에 대한 행위는 HTTP Method로 표현

  • GET /members/1                   (o)
  • GET /members/get/1             (x)
  • GET /members/add                 (x)
  • POST /members                       (o)
  • GET /members/update/1        (x)
  • PUT /members/1                     (o)
  • GET /members/del/1               (x)
  • DELETE /members/1               (o)

 

 

 

 

4. 슬래시 구분자(/)는 계층을 나타낼 때 사용

http://domain/houses/apartments

http://domain/departments/1/employees

  • URI 마지막 문자로 슬래시 구분자(/)를 포함하지 않습니다.
  • 하이픈(-)은 URI가독성을 높일 때 사용합니다.
  • 언더바(_)는 사용하지 않습니다.
  • URI경로는 소문자만 사용합니다.
  • RFC 3986(URI 문법 형식)은 URI스키마와 호스트를 제외하고는 대소문자를 구별합니다.
  • 파일 확장자는 URI에 포함하지 않습니다.
  • Accept Header를 사용합니다.

 

 

 

 

5. 상태 코드

상태 코드 (성공)

 

 

 

 

 

상태 코드 (클라이언트로 인한 오류)

 

 

 

 

 

 

 

상태 코드 (서버로 인한 오류)

 

 

 

 

 

6. Web API 실습 코드

 

<!-- web.xml 파일을 삭제해도 eclipse에서 오류가 발생하지 않는다. -->
		<failOnMissingWebXml>false</failOnMissingWebXml>
	</properties>
	<dependencies>
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>5.1.45</version>
		</dependency>

		<!-- json 라이브러리 databind jackson-core, jackson-annotaion에 의존성이 있다. -->
		<dependency>
			<groupId>com.fasterxml.jackson.core</groupId>
			<artifactId>jackson-databind</artifactId>
			<version>2.9.4</version>
		</dependency>

		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>javax.servlet-api</artifactId>
			<version>3.1.0</version>
			<scope>provided</scope>
		</dependency>

		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>jstl</artifactId>
			<version>1.2</version>
		</dependency>

		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>3.8.1</version>
			<scope>test</scope>
		</dependency>
	</dependencies>

pom.xml

 

 

 

package kr.or.connect.webapiexam.api;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;

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.jdbcRole.dao.RoleDao;
import kr.or.connect.jdbcRole.dto.Role;


@WebServlet("/roles")
public class RoleServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       

    public RoleServlet() {
        super();
        // TODO Auto-generated constructor stub
    }


	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		response.setCharacterEncoding("utf-8");
		response.setContentType("application/json");		// 

		RoleDao dao = new RoleDao();

		List<Role> list = dao.getRoles();
		
		// json 패키지가 제공 : json문자열로 바꾸거나, json문자열을 객체로 바꾸어줌
		ObjectMapper objectMapper = new ObjectMapper();
		String json = objectMapper.writeValueAsString(list);
		
		PrintWriter out = response.getWriter();
		out.println(json);
		out.close();
	}

}

 RoleServlet.java

 

 

 

 

 

 

 

 

 

 

7. Web API 실습 코드 2

 

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.jdbcRole.dao.RoleDao;
import kr.or.connect.jdbcRole.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();
		
	}

}

RoleByIdServlet.java

 

 

 

 

 

-> url 의 정보를 가져와서 roleId 가 501 번인 정보를 가져와서 json 형식으로 출력한다.

 

 

이처럼 JDBC와 서블릿을 이용해서 직접 API 를 만드는 경우는 매우 드물다.

대부분 Spring Framework 에서 API를 작성한다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

반응형

+ Recent posts