https://www.inflearn.com/course/http-%EC%9B%B9-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC/
ㅁ HTTP 메서드
ㅇHTTP API를 만들어보자
- API URI 고민
> 가장 중요한건 리소스
> 리소스를 어떻게 식별하는게 좋을까?
> ex) 회원 목록조회, 회원 등록, 회원 수정 -> 회원!
> 계층 구조상 상위를 컬렉션으로 보고 복수단어 사용 권장
> URI는 리소스만 식별
> 리소스와 해당 리소스를 대상으로 하는 행위를 분리
> 리소스는 명사, 행위는 동사
ㅇ HTTP 메서드 - GET , POST
- GET
> 리소스 조회
> 서버에 전달하고 싶은 데이터는 query (쿼리 파라미터, 쿼리 스트링)를 통해서 전달
> 메시지 바디를 사용해서 데이터를 전달할 수 있지만, 지원하지 않는 곳이 많아서 권장하지 않음
- POST
> 요청 데이터 처리
> 메시지 바디를 통해 서버로 요청 데이터 전달
> 서버는 요청 데이터를 처리
- 요청 데이터를 어떻게 처리한다는 뜻일까?
> POST 메서드는 대상 리소스가 리소스의 고유 한 의미 체계에 따라 요청에 포함 된 표현을 처리하도록 요청
> 이 리소스 URI에 POST 요청이 오면 요청 데이터를 어떻게 처리할지 리소스마다 따로 정해야 함 -> 정해진 것이 없음
- POST 정리
1. 새 리소스 생성 (등록)
2. 요청 데이터 처리 - 컨트롤 URI (ex ) /orders/{orderId}/start-delivery )
3. 다른 메서드로 처리하기 애매한 경우
ㅇ HTTP 메서드 - PUT, PATCH, DELTE
- PUT
> /members/100 으로 요청
> 리소스를 완전히 대체 ( 쉽게 이야기해서 덮어 버림 - 기존 데이터 삭제 )
> 리소스가 없으면 생성
- PATCH
> 리소스 부분 변경
- DELETE
> 리소스 제거
ㅇ HTTP 메서드 속성
- 안전함
> 호출해도 리소스를 변경하지 않는다. (GET)
- 멱등
> POST 만 멱등이 아님
- 캐시가능
> GET, HEAD, POST, PATCH 캐시 가능
- 실제로는 GET, HEAD 정도만 캐시로 사용
- POST, PATCH는 본문 내용까지 캐시 키로 고려해야 하는데, 구현이 쉽지 않음
ㅁ HTTP 메서드 활용
ㅇ 클라이언트에서 서버로 데이터 전송
- 쿼리파라미터를 통한 데이터 전송
> GET, 주로 정렬 필터(검색어)
- 메시지 바디를 통한 데이터 전송
> POST, PUT, PATCH
> 회원 가입, 상품 주문, 리소스 등록, 리소스 변경
HTML Form 데이터 전송
- HTML Form submit시 POST 전송
- Content-Type: application/x-www-form-urlencoded 사용
> form의 내용을 메시지 바디를 통해서 전송 ( key= value, 쿼리 파라미터 형식 )
> 전송 데이터를 url encoding 처리 (UTF-8 형식)
- HTML Form 은 GET 전송도 가능 - 정렬이나 조건 검색시 (사용하지 않는게 좋음)
- Content-Type: multipart/form-data
> 파일 업로드 같은 바이너리 데이터 전송시 사용
> 다른 종류의 여러 파일과 폼의 내용과 함께 전송 가능 (그래서 이름이 multipart)
- 참고: HTML Form 전송은 GET, POST 만 지원
HTTP API 데이터 전송
- 서버 to 서버
- 앱 클라이언트 : 아이폰, 안드로이드
- 웹 클라이언트 : HTML 에서 Form 전송 대신 자바스크립트를 통한 통신에 사용 (AJAX)
- POST, PUT, PATCH: 메시지 바디에 데이터를 전송
ㅇ HTTP API 설계 예시
- PUT을 통한 등록과 POST를 통한 등록의 차이
> PUT을 통한 등록시, 등록될 리소스의 URI를 지정해줘야함 (ex ) /items/{itemId}, /files/star.jpg )
-> 스토어 방식 ( 클라이언트가 리소스의 URI를 알고 관리)
> POST -> 컬렉션 방식
- 컨트롤 URI를 통해 동사를 직접 사용하여 URI에 표시하여, 리소스를 다룸
'Network' 카테고리의 다른 글
[Network] 모든 개발자를 위한 HTTP 웹 기본 지식 - 4 (0) | 2021.12.16 |
---|---|
[Network] 모든 개발자를 위한 HTTP 웹 기본 지식 - 3 (0) | 2021.12.15 |
[Network] 모든 개발자를 위한 HTTP 웹 기본 지식 - 1 (0) | 2021.12.14 |
[네트워크] NAT란? (0) | 2019.11.30 |