HTTP 메서드 종류
⭐️ GET (조회)
- 리소스 조회.
- 서버에 전달하고싶은 데이터는 query(쿼리 파라미터, 쿼리 스트링)를 통해서 전달.
- 메시지 바디를 사용해서 데이터를 전달할 수 있지만, 지원하지 않는 곳이 많아서 권장하지 않음.
⭐️ POST (등록)
- 요청 데이터 처리, 주로 등록에 사용.
- 메시지 바디를 통해 서버로 요청 데이터 전달.
- 서버는 요청 데이터를 처리.
- 메시지 바디를 통해 들어온 데이터를 처리하는 모든 기능을 수행한다.
- 주로 전달된 데이터로 신규 리소스 등록, 프로세스 처리에 사용.
- POST 메서드는 대상 리소스가 리소스의 고유 한 의미 체계에 따라 요청에 포함 된 표현을 처리하도록 요청.
- ex) HTML FORM에 입력 한 정보로 회원가입, 주문
- 게시판 글쓰기, 댓글 달기
- 신규 주문 생성
- 한 문서 끝에 내용 추가
- 새 리소스 생성(등록)
- 요청 데이터 처리
- 프로세스를 처리해야하는 경우 (ex) 결재완료->배달시작->배달완료 (컨트롤 URI)
- 다른 메서드로 처리하기 애매한 경우
- ex) JSON으로 조회 데이터를 넘겨야 하는데, GET 메서드를 사용하기 어려운 경우
⭐️ PUT (덮어쓰기)
- 리소스를 대체, 해당 리소스가 없으면 생성
- 리소스가 있으면 대체
- 기존 리소스를 삭제하고 덮어쓰는 개념이기 때문에 필드 1, 2, 3이 기존에 존재하는 곳에 필드 3만 넣고 보내면 1, 2, 3이 삭제되고 새로 넣은 3만 들어가게 되니 ⚠️ 주의 필요
- 리소스가 없으면 생성
- 덮어쓰기 개념
- ⚠️ 클라이언트가 리소스를 식별
⭐️ PATCH (업데이트)
- 리소스 부분 변경 (업데이트)
- PUT과 다르게 삭제 후 생성이 아니고 기존 값을 수정하는 개념
- PATCH가 지원이 안되면 POST를 사용하면 된다.
⭐️ DELETE (삭제)
HEAD
- GET과 동일하지만 메시지 부분을 제외하고, 상태 줄과 헤더만 반환
OPTIONS
- 대상 리소스에 대한 통신 가능 옵션(메서드)을 설명 (주로 CORS에서 사용)
CONNECT
- 대상 자원으로 식별되는 서버에 대한 터널을 설정
TRACE
- 대상 리소스에 대한 경로를 따라 메시지 루프백 테스트를 수행
HTTP 메서드의 속성
안전 (Safe)
- 호출해도 리소스를 변경하지 않는다.
- GET, HEAD, OPTIONS, TRACE
멱등 (Idempotent)
- f(f(x)) = f(x)
- 한 번 호출하던 두 번 호출하던 100번 호출하던 결과가 모두 같다
- 활용
- 멱등은 외부 요인으로 중간에 리소스가 변경되는 것 까지는 고려하지 않는다.
캐시가능 (Cacheable)
- 응답 결과 리소스를 캐시해서 사용해도 되는가?
- GET, HEAD, POST, PATCH 캐시 가능
- 실제로는 GET, HEAD 정도만 캐시로 사용
- POST, PATCH는 본문 내용까지 캐시 키로 고려해야 하는데, 구현이 쉽지 않음
📌 클라이언트 - 서버 데이터 전송
정적 데이터 조회
GET/static/star.jpg HTTP/1.1
Host: localhost:8080
- 쿼리 파라미터 미사용
- 이미지, 정적 텍스트 문서
- 조회는 GET 사용
- 정적 데이터는 일반적으로 쿼리 파라미터 없이 리소스 경로로 단순하게 조회 가능
동적 데이터 조회
GET/search?q=hello&hl=ko HTTP/1.1
Host: www.google.com
- 쿼리 파라미터 사용 (쿼리 파라미터를 기반으로 정렬 필터해서 결과를 동적으로 생성)
- 주로 검색, 게시판 목록에서 정렬 필터(검색어)
- 조회 조건을 줄여주는 필터, 조회 결과를 정렬하는 정렬 조건에 주로 사용
- 조회는 GET 사용
- GET은 쿼리 파라미터를 사용해서 데이터 전달
Post 전송 - 저장
POST/save HTTP 1.1
Host: localhost:8080
Content-type:application/x-www-form-urlencoded
username=kim&age=20
- HTML Form submit시 POST 전송
- 회원 가입, 상품 주문, 데이터 변경 등에 사용
- Content-Type: application/x-www-form-urlencoded
- form의 내용을 메시지 바디를 통해서 전송 (key=value, 쿼리 파라미터 형식)
- 전송 데이터를 url encoding처리 (서버에서 별도 디코딩 작업 필요)
- HTML Form은 GET도 전송 가능 (조회)
POST/save HTTP/1.1
Host: localhost:8080
Content-Type: multipart/form-data; boundary=----XXX
------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
109238a9o0p3eqwokjasd09ou3oirjwoe9u34ouief...
------XXX--
- Content-Type: multipart/form-data
- 파일 업로드 같은 바이너리 데이터 전송시 사용
- 다른 종류의 여러 파일과 폼의 내용 함께 전송 가능
📌HTML Form 전송은 GET, POST만 지원
HTTP API 전송
POST/memebers HTTP/1.1
Content-Type:application/json
{
"username": "jeong",
"age": 20
}
- 서버 to 서버
- 앱 클라이언트
- 웹 클라이언트
- HTML에서 Form 전송 대신 자바 스크립트를 통한 통신에 사용(AJAX)
- React, Vue.js 같은 웹 클라이언트와 API 통신
- POST, PUT, PATCH : 메시지 바디를 통해 데이터 전송
- GET : 조회, 쿼리 파라미터로 데이터 전달
- Content-Type : application/json 사용