HTTP의 상태코드와 메서드, REST API
- HTTP의 상태코드
1xx (정보) : 요청을 받았으며 프로세스를 계속한다.
2XX (성공) : 요청을 성공적으로 받았으며 인식했고 수용한다.
- 200OK : 요청이 성공적으로 되었습니다.
- 201 created: 요청이 성공적이었으며 그 결과 새로운 리소스가 생성되었습니다.
3xx (리다이렉션) : 요청 완료를 위해 추가 작업 조치가 필요하다
- 301 Moved perma nently : 이 응답코드는 요청한 리소스의 URI가 변경되었음을 의미합니다. 변경된 새로운 URI를
응답에서 주는것이 좋습니다.
4XX (클라이언트 오류) : 요청의 문법이 잘못되었거나 요청을 처리할 수 없다.
- 400 Bad Request : 이 응답은 잘못된 문법으로 인하여 서버가 요청을 이해할 수 없음을 의미합니다.
- 401 Unauthorized : 클라이언트의 인증이 되지 않았음을 의미합니다.
5XX (서버오류) : 서버가 명백히 유효한 요청에 대해 충족을 실패했다.
- 500 Internal Server Error : 서버에 오류가 있음을 의미한다.
- 메서드(GET, POST, PUT, PATCH, DELETE)
POST : 자원을 생성
성공적으로 생성되면 HTTP 상태 201을 반환
GET : 읽기
성공시 200, 오류의 경우 자주 404(NOT FOUND) 또는 400(BAD REQUEST)를 반환한다.
데이터를 수정 삭제하는데 사용하면 안됨
PUT : 업데이트(전체 자원)
- 요청을 보낼 때 전체를 보내야 함
PATCH : 업데이트(일부 자원)
- 요청을 보낼 때 수정하는 일부분을 보내야 함, 응답으로 받는 메시지는 수정된 결괏값과 동일해야 한다.
DELETE : 삭제
- REST API (Application programming interfate)
API는 소프트웨어와 소프트웨어 사이 데이터 전송을 가능하게 하는 프로그램
웹의 장점을 잘 살린 아키텍처이며 먼저 이 아키텍처는 Uniform-Interface를 갖는 것이 특징이다.
Uniform-Interface
자원들이 각각의 독립적인 인터페이스를 가져야한다.
- 웹페이지를 변경했다고 웹 브라우저를 업데이트 하는일은 없어야 한다.
- HTTP 명세나 HTML명세가 변경되어도 웹페이지는 잘 작동해야 한다.
이 아키텍처의 규칙은 다음과 같다.
1.Self-descriptive messages
HTTP Header에 타입을 명시하고 각 메시지(자원)들은 MIME types에 맞춰 표현되어야 한다.
예를들어 .json을 반환한다면 application/json으로 명시해주어야한다. MIME types는 문서, 파일 등의 특성과 형식을
나타내는 표준이다. 'font/ttf', 'text/plain', 'test/csv'등을 말한다.
2.HATEOAS 구조
하이퍼 링크에 따라 다른 페이지를 보여줘야 하며 데이터마다 어떤 URL에서 원했는지 명시해 주어야 한다.
혹은 data위에 링크를 써야 한다.
3.Stateless
HTTP자체가 stateless이기 때문에 HTTP를 이용하는것만으로도 만족한다.
REST API를 제공해주는 서버는 세션을 해당서버쪽에 유지하지 않는다는 의미이다.
4.Cacheable
HTTP는 원래 캐싱이 된다. 새로고침을 하면 304가 뜨면서 원래 있던 js와 css이미지등을 불러온다. 이러한 캐싱은 네트워크 요청을 줄여주며 UX 향상에 도움이 된다. 네트워크 요청 시 해당하는 자원들을 복사해서 메모리에 저장해 두었다가 또 같은 요청 시 네트워크 요청을 하지 않고 브라우저 메모리에 있던 자원을 다시 반환한다.
HTTP 메서드 중 GET에 한정되며 'cache-control:max-age=100' 이런식으로 시간을 정할 수 있다.
5.client-server 구조
클라이언트와 서버가 서로 독립적인 구조를 가져야 한다. 각자 맞는 로직만 잘 처리하면 된다.
6.Layered system
계층구조로 아키텍처를 만들 수 있다
URI 규칙
자원을 표기하는 아래의 6가지 규칙을 적용해야한다.
1) 동작은 HTTP 메소드로 해야한다. 수정 = put, 삭제 = delete, 추가 = post, 조회 = get...
예를들어 /books/delete/1이렇게 표기하면 안된다.
2) 확장자는 표기하지 말아야 한다.
3) 동사가 아닌 명사로만 표기해야 한다.
4) URI는 계층적인 내용을 담고 있다.
5)소문자로 쓰며 너무 길 경우는 **-**를 쓴다.
6) HTTP응답 상태 코드를 활용한다.
이러한 규칙은 예시를 보는게 더 좋을것같다.
app.get('/books/) : 모든책을 조회한다.
app.post('/books/booksid') 책을 생선한다.
즉 주소에 메서드를 표기하지 않는다!