HTTP 메서드
API 만드는 과정
(1) 요구사항 확인
(2) API URI 설계
(3) 리소스와 행위를 분리
가장 중요한 건 리소스를 식별하는 것이다.
요구사항이 '회원 정보 관리 API를 만들기' 라면, '회원 등록하기'에서의 리소스는 '등록'이 아닌 '회원'이라는 것!
행위 → 조회, 등록, 삭제, 변경 (GET, POST, PUT, PATCH, DELETE)
HTTP 메서드 종류
GET : 리소스 조회
POST : 요청 데이터 처리, 주로 등록에 사용
PUT : 리소스를 대체, 해당 리소스가 없으면 생성
PATCH : 리소스 부분 변경
DELETE : 리소스 삭제
아래는 안쓰는 메서드
HEAD : GET과 동일하지만 메시지 부분을 제외하고, 상태 줄과 헤더만 반환
OPTIONS : 대상 리소스에 대한 통신 가능 옵션(메서드)을 설명(주로 CORS에서 사용)
CONNECT : 대상 리소스로 식별되는 서버에 대한 터널을 설정
TRACE : 대상 리소스에 대한 경로를 따라 메시지 루프백 테스트를 수행
GET
- 리소스 조회
- 서버에 전달하고 싶은 데이터는 query를 통해서 전달
- 메시지 바디를 사용해서 데이터를 전달할 수 있지만, 지원하지 않는 곳이 많아서 권장하지 않음!
POST
- 요청 데이터 처리
- 메시지 바디를 통해 서버로 요청 데이터 전달
- 서버는 요청 데이터를 처리 (메시지 바디를 통해 들어온 데이터를 처리하는 모든 기능을 수행)
- 주로 전달된 데이터로 신규 리소스 등록, 프로세스 처리에 사용
- POST 메서드는 대상 리소스가 리소스의 고유한 의미 체계에 따라 요청에 포함된 표현을 처리하도록 요청
쉽게 말해서 POST 요청을 어떻게 처리할지는 따로 정해야한다.
(1) 주로 새 리소스 생성할 때 (등록)
(2) 요청 데이터 처리할 때
단순히 데이터를 생성 or 변경이 아니라 어떠한 프로세스를 추가적으로 처리해야할 때
예를 들면 .. 결제완료 → 배달시작 → 배달완료 처럼 값 변경 뿐만아니라 상태가 변경되는 경우
즉, POST의 결과로 새로운 리소스가 생성되지 않을 수 있음 (컨트롤URI)
(3) 다른 메서드(겟, 풋, 패치 등)로 처리하기 애매할 때
PUT
- 리소스를 완.전.히 대체해버림 (있으면 대체, 없으면 생성)
- 클라이언트가 리소스를 식별함 (PUT /members/100)
주의! 나이만 변경하려고 나이만 보냈더니 기존걸 지우고 나이만 남음.. 완전히 대체해버려서
PATCH
- 리소스 부분 변경
- 아주 일부 PATCH가 안되는 경우가 있을 땐 POST를 쓰면 된다.
DELETE
- 리소스 제거
HTTP 메서드의 속성
(1) 안전(Safe Methods)
- 호출해도 리소스를 변경하지 않는다.
- GET, HEAD
(2) 멱등(Idempotent Methods)
- 한 번 호출하든 백 번 호출하든 결과가 똑같다.
- GET, PUT, DELETE
- POST는 멱등이 아니다! (두 번 호출하면 두 번 결제될 수 있음)
- 서버가 정상 응답을 못했을 때, 클라이언트가 같은 요청을 다시해도 되는가가 판단 근거
(3) 캐시가능(Cacheable Methods)
- 응답 결과 리소스를 캐시해서 사용해도 되는가?
- GET, HEAD, POST, PATCH 캐시 가능
- 하지만 실제로는 GET, HEAD 정도만 캐시 사용
(POST, PATCH는 본문 내용까지 캐시 키로 고려해야하는데 어려움)
HTTP 메서드 활용
클라이언트에서 서버로 데이터 전달 방식
(1) 쿼리 파라미터
- GET
- 주로 정렬 필터(검색어)
(2) 메시지 바디
- POST, PUT, PATCH
- 회원 가입, 상품 주문, 리소스 등록, 리소스 변경 등
클라이언트에서 서버로 데이터 전송 4가지 상황
1. 정적 데이터 조회
- 이미지, 정적 텍스트 문서 조회할 때
- GET사용
- 일반적으로 쿼리 파라미터 없이 리소스 경로로 단순하게 조회
2. 동적 데이터 조회
- 주로 검색, 게시판 목록에서 정렬 필터(검색어)
- 조회 조건을 줄여주는 필터, 조회 결과를 정렬하는 정렬 조건에 주로 사용
- 조회는 GET 사용
- GET은 쿼리 파라미터를 사용해서 데이터 전달 (메세지 바디 방법은 권장안함)
3. HTML Form을 통한 데이터 전송
- HTML Form 전송은 GET, POST만 지원
- HTML Form submit시 POST 전송
회원 가입, 상품 주문, 데이터 변경
- HTML Form 은 GET 전송도 가능 (조회하는 용도로만!)
- Content-Type:application/x-www-form-urlencoded 사용
form의 내용을 메시지 바디를 통해서 전송 (키밸류, 쿼리파라미터 형식)
전송 데이터를 url encoding 처리 (abc김 → abc%EA$B9%80)
- Content-Type: multipart/form-data
파일 업로드 같은 바이너리 데이터 전송시 사용
다른 종류의 여러 파일과 폼의 내용 함께 전송 가능 (그래서 멀티파트)
(1) form 으로 POST 전송 (저장하기)
<form action='/save' method='post'>
<input type='text' name='username' />
<input type='text' name='age' />
<button type='submit'>저장하기</button>
</form>
▼ 웹 브라우저가 생성한 요청 HTTP메시지
POST /save HTTP/1.1 Host: localhost:8080 Content-Type: application/x-www.form-urlencoded&age=20 username=kim |
(2) form 으로 GET 전송 (조회하기)
<form action='/save' method='get'>
<input type='text' name='username' />
<input type='text' name='age' />
<button type='submit'>조회하기</button>
</form>
▼ 웹 브라우저가 생성한 요청 HTTP메시지
GET /members?username=kim&age=20 HTTP/1.1 Host: localhost:8080 |
(3) multipart/form-data
<form action='/save' method='post' enctype='multipart/form-data'>
<input type='text' name='username' />
<input type='text' name='age' />
<input type='file' name='file1' />
<button type='submit'>조회하기</button>
</form>
▼ 웹 브라우저가 생성한 요청 HTTP메시지
POST /save HTTP/1.1 Host: localhost:8080 Content-Type: multipart/form-data; boundary=-----XXX Content-Length: 10457 ------XXX Content-Disposition: form-data; name='username' kim ------XXX Content-Disposition: form-data; name='age' 20 ------XXX Content-Disposition: form-data; name='file1'; filename='intro.png' Content-Type: image/png 109238a9szfdzsfdsszfzfsd.... ------XXX |
4. HTTP API를 통한 데이터 전송
- 백엔드끼리 시스템 통신할 때 주로 사용 ( 서버 to 서버 )
- 앱 클라이언트에서 전송할때 주로 사용
- 웹 클라이언트
HTML에서 Form 전송 대신 자바스크립트를 통한 통신에 사용 (AJAX)
React, Vue 같은 웹 클라이언트와 API통신
- POST, PUT, PATCH : 메시지 바디를 통해 데이터 전송
- GET : 조회, 쿼리 파라미터로 데이터 전달
- Content-Type: application/json을 주로 사용 (거의 표준)
TEXT, XML, JSON 등 있음
참고 강의 : https://taylog.tistory.com/203
'🧠 저장 > Http' 카테고리의 다른 글
HTTP 상태코드 간단 정리 (0) | 2024.02.20 |
---|---|
HTTP API 설계 개념 간단 정리 (0) | 2024.02.17 |
HTTP 특징, 구조 간단 정리 (0) | 2024.02.11 |
웹 브라우저 요청 흐름 간단 정리 (0) | 2024.02.08 |
IP, TCP, UDP, URI 간단 정리 (0) | 2024.02.05 |