HTTP - 대표적인 메서드와 속성

프동프동·2022년 7월 1일
0
post-thumbnail

HTTP 메서드

클라이언트가 서버에게 무언가를 요청할 때 기대하는 행동이다.

GET

Resource 조회

GET /posts/{ID}?q=tim&hl=ko

  • 해당 URL에서 자원을 요청
  • 서버에 전달하려는 데이터는 "?" 쿼리 파라미터 를 통해서 전달
  • Message body 전달이 가능하나 권장하지 않음

POST

요청 데이터 처리, 주로 등록에 사용

POST /posts
{
"post": "name"
}

  • Message body를 통해 서버로 요청 데이터 전달
  • 서버는 body를 통해 들어온 요청 데이터를 처리
  • 신규 Resource 등록에 많이 사용
    • HTML FORM으로 입력된 회원 가입, 주문 등에서 사용
    • 게시판 글쓰기, 댓글 쓰기
    • 신규 주문 생성
    • 기존 자원에 데이터 추가(문서 끝에 내용 추가)
    • 프로세스 처리(새로운 리소스가 생성되지 않을 수도 있음)
      • POST /orders/{orderid}/start-delivery (컨트롤 URI)
    • 다른 메서드로 처리하기 애매한 경우
      • 조회용으로 GET 메서드 Body에 넣고 싶은 경우 조회지만 POST를 사용해야한다.

PUT

Resource를 대체할 때 사용, 해당 리소스가 없으면 생성

PUT /posts/100
{
"post" : "name"
}

  • 리소스를 대체(덮어씌움)
    • 리소스가 있으면 대체
    • 리소스가 없으면 생성(없는 인덱스는 필드자체를 없애버린다.)
  • Client가 리소스 위치를 알고 있어야하며 URI를 지정한다.
    • POST와 다른 점

PATCH

Resource 부분 변경

PATCH /posts/100
{
"post" : "name"
}

  • PATCH는 PUT 이후에 나온 것이므로 지원안되는 곳이 존재할 수 있다. 이럴땐 POST를 사용하면 된다.

DELETE

Resource 삭제

DELETE /posts/

HTTP 메시지 속성


위키피디아 - HTTP

안전(Safe)

호출해도 리소스가 변경되지 않음

  • 계속 호출하여 로그가 쌓여 장애가 발생하여도 안전의 경우는 해당 리소스만 고려한다.
    안전 메서드:
  • GET
  • HEAD

멱등(Idempotent)

계속 호출해도 결과가 같아야한다.
멱등 메서드:

  • GET: 여러번 호출하여도 같은 결과가 조회되어야한다.
  • PUT: 결과를 대체한다. 같은 요청을 해도 최종결과는 같다.
  • DELETE: 결과를 삭제한다. 같은 요청을 해도 삭제된 결과는 같다.

    POST는 멱등이 아니다. 두 번 호출시 문제가 발생할 수 있음(중복 결제)

멱등은 외부 요인으로 중간에 리소스가 변경되는 것 까지 고려하지 않는다.

캐시가능(Cacheable)

  • 응답 결과 리소스를 캐시해서 사용해도 되는가?
  • GET, HEAD, POST, PATCH 캐시 가능

    실제로는 GET, HEAD정도만 캐시로 사용
    POST, PATCH는 본문 내용까지 캐시 키로 고려해야하므로 구현이 쉽지 않음


클라이언트에서 서버로 데이터를 전송하는 방법

  • 쿼리 파라미터를 이용하여 데이터 전송
    • GET
    • 주로 정렬 필터
      • 검색어를 치거나
      • 게시판 리스트에 정렬 조건을 넣을 때
  • 메시지 바디를 통하여 데이터 전송
    • POST, PUT, PATCH
      • 회원가입, 상품주문, 리소스 등록/변경

정적 데이터 조회

쿼리 파라미터 미사용

이미지, 정적 텍스트 문서 조회는 GET을 사용한다.
정적 데이터는 쿼리 파라미터 없이 리소스 경로로 조회

  • Client
    GET /board/lion.jpg

  • Server
    HTTP/1.1 200 OK

    pqeopwfkqwpoefkqpowefkqpwfk
    qpwokfqpwefkqpwoefkqwpofek

동적 데이터 조회

쿼리 파라미터 사용

검색, 게시판 목록에서 정렬 필터 조회 시 GET을 사용한다.
조회 조건을 줄여주는 필터, 조회 결과를 정렬하는 정렬 조건에 주로 사용
GET은 쿼리 파라미터를 사용해서 데이터를 전달

쿼리 파리미터를 기반으로 결과를 동적으로 생성

  • Client
    GET /search?q=hello&hl=ko HTTT/1.1
  • Server
    {

HTML Form 데이터 전송(GET, POST만 지원한다)

POST 전송 - 저장

<from action="/save" method="post">
  <input type="text" name="username" />
  <input type="text" name="age" />
  <button type="submit">전송</button>
</form>

Form 태그에 작성 시 웹브라우저가 HTTP 메시지를 생성해준다.

POST /save HTTP/1.1
HOST: localhost:3000
Content-Type: application/x-www-form-urlencoded

username=kim&age=30

multipart/form-data

<from 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:3000
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="temp.png"
Content-Type: image/png

13pokf23pof2p3o4kf23fn2p3oifn...
-----XXX--

HTTP API 데이터 전송

Client가 모두 작성해주면 된다.

  • 서버에서 서버로 통신 시 사용
  • 앱 클라이언트
  • 웹 클라이언트
    -- Form 전송 대신 자바스크립트를 통한 통신에 사용(AJAX)
    POST, PUT, PATCH: 메시지 바디를 통해 데이터 전송
    GET: 조회
    Content-Type: application/json을 주로 사용(사실상 표준)
profile
좋은 개발자가 되고싶은

0개의 댓글