HTTP의 Request, Response 메시지 형태 (feat: iOS 개발자)

minsson·2022년 11월 19일
0

제가 나중에 보기 위해 정리해놓은 자료이므로 틀린 내용이 있을 수 있습니다. 댓글로 피드백 주시면 바로 수정하겠습니다. 감사합니다. ☺️ - 민쏜 -


🏞️ HTTP의 Request, Response 메시지 형태

클라이언트와 서버는 Request(요청)과 Response(응답)을 주고 받는다.

🧩 HTTP 요청 메시지

POST /form/entry HTTP /1.1 <- 시작라인: 메소드 / 요청대상(경로) / HTTP 버전
Host: www.naver.com        <- Header 시작: 모든 부가 정보 
Connection: Keep-alive                    (HTTP 전송에 필요한 메타 데이터)
Content-Type: application/x-www-form-urlencoded
Content-Length: 16         <- Header 끝: 예시일 뿐, 실제로는 더 많은 정보가 있다.
                           <- 공백 라인
name=gildong&age=20        <- Message Body: 실제 전송할 데이터
                                            (JSON, HTML 문서, 이미지, 영상 등)
  • 이런 Request의 과정을 Query라고도 한다.
    • Request를 보낸다 == Query를 보낸다.
  • Query Parameter(쿼리 파라미터)를 통한 데이터 전송
    • GET 메서드의 경우 아래와 같이 시작 라인의 주소에 쿼리 파라미터를 쓰는 경우가 많다.
    • 검색어나 정렬 기준 등을 전달할 때 사용된다.
      GET /search?q=apple&hl=ko HTTP /1.1 <- apple을 검색해주고, 언어는 한국어로 해줘
      Host: www.google.com
    • Query Parameter
      • 예시) ?q=apple&hl=ko
      • ?로 시작한다
      • key=value의 형태
      • &를 붙여 조건을 추가한다
  • Message Body를 통한 데이터 전송
    • POST / PUT / PATCH 메서드가 여기에 해당된다.
      • 아래 예시와 같이 GET도 이렇게 보낼 수는 있지만, 보통 Query Parameter를 통해 보낸다.
    • 회원가입, 게시글 작성, 게시글 수정 등에 사용된다.
      GET /search HTTP /1.1
      Host: www.google.com
      Content-Type: application/x-www-form-urlencoded
      Content-Length: 13
      
      q=swift&hl=ko <--- POST / PUT / PATCH의 경우 이렇게 Message Body에 넣는다.
                         GET의 경우 보통 여기가 아니라 Query Parameter를 통해 보낸다.

🧩 HTTP 응답 메시지

HTTP /1.1 200 OK                      <- 시작라인: HTTP 버전 / 상태코드 / 해설
Date: Sat, 19 Nov 2022 10:00:00 GMT   <- Header 시작: 모든 부가 정보
Content-Length: 123                      (HTTP 전송에 필요한 메타데이터)
Content-Type: text/html               <- Header 끝
                                      <- 공백 라인
<html>                                <- Message Body: 실제 전송할 데이터
...                                      (JSON, HTML 문서, 이미지, 영상 등)
  • Response를 Data라고도 한다.
    • Request를 받아 Response를 보낸다 == Query를 받아 Data를 보낸다.

🧩 HTTP 메서드의 종류

  • 실제로는 11개이지만, 우리가 알아둘 것은 핵심 4개와, 보너스 1개 정도면 된다.

  • CRUD (Create, Post, Put, Delete)의 기능을 수행하는 HTTP 메서드가 핵심

    CRUDHTTP MethodsDescriptionExample
    CreatePOST등록게시판 글쓰기 / 댓글 달기 / 새로운 주문 생성
    ReadGET조회게시판 글 읽어오기 (데이터 가져오기)
    UpdatePUT데이터 덮어씌우기게시글 수정 (데이터 전부 대체)
    DeleteDELETE삭제게시물 삭제
  • 이에 더해 PATCH도 알아두면 좋다.

    • PUT과 유사하지만, PUT은 데이터를 전부 대체하거나, 없는 경우 생성하는 반면, PATCH는 필요한 부분을 부분 변경한다.
    • 게시물에 좋아요를 누르면 게시물의 일부분인 like 속성을 부분 변경하는 것이다.

🧩 HTTP 응답 상태 코드

  • 각 응답 상태 코드를 모두 숙지하면 좋겠지만, 외워야 할 부분은 아니라고 생각하여 생략한다.

  • 우리가 많이 접하는 건 200번대, 400번대, 500번대의 코드들이다.

    Status CodeClassDescription
    1xx (100번대)Informational리퀘스트를 받아들여 처리 중 (거의 사용되지 않음)
    2xx (200번대)Success리퀘스트를 정상적으로 처리함
    3xx (300번대)Redirection리퀘스트를 완료하기 위해서 추가 동작이 필요
    4xx (400번대)Client Error서버가 리퀘스트를 이해하지 못함 (요청 양식이 틀림)
    5xx (500번대)Server Error서버가 리퀘스트 처리 실패 (서버 내부의 문제)

🧩 Response Data의 형태 (앱에서 처리하는 데이터의 형태)

  • 아래와 같은 JSON 형식으로 응답이 날아온다.
    • 예전에는 XML 형식이었으나, 약 10년 전부터 이런 형식을 사용한다.
    {
        "이름": "홍길동",
        "나이": 55,
        "성별": "남",
        "주소": "서울특별시 양천구 목동",
        "특기": ["검술", "코딩"],
        "가족관계": {"#": 2, "아버지": "홍판서", "어머니": "춘섬"},
        "회사": "경기 수원시 팔달구 우만동"
     }
  • XML 형식
    <users> 
    	<user>
    		<name>John</name>
    		<age>22</age>
    	</user>
    	<user> 
    		<name>Mary</name> 
    		<age>21</age>
    	</user> 
    </users>
    • HTML 태그와 비슷 (열고, 닫고)
    • 데이터 용량 효율이 떨어진다.
    • 위의 예시를 봐도 내용보다 태그가 더 많아 보인다.
  • JSON 형식
    [
    	{
    		"name": "John",
    		"age": 22
    	},
    	{
    		"name": "Mary",
    		"age": 20
    	},
    ]
    • 이 JSON 형식으로 데이터를 받아 APP에서 보여줘야 하는데, 어떻게 보여줘야 할까?
      • 일단 JSON 형식의 데이터를 Swift에서 사용 가능한 타입으로 변경해야 한다. (Decoding)
        • 구조체, 클래스 등으로 변경하는 게 일반적이다.

🧩 REST API

  • REST한 방식의 API(Application Programming Interface)
    • 예전에는 SOAP 방식이었으나, 약 10년 전부터 거의 대부분 REST한 방식을 쓴다.
    • 계약, 룰, 사용법의 역할
      • 요청과 응답 방식에 대한 약속
      • 즉, 어떤 주소로, 무엇을 이렇게 요청하면, 이런 응답(결과)를 줄지에 대한 약속
  • 약속의 형식을 명사형으로 만들어, 네이밍만 봐도 무엇과 관련된 건지 이해되게 만들었음
    [https://(사이트](https://사이트) 주소)/movielists               <- 상영중인 영화 목록 GET
    [https://(사이트](https://사이트) 주소)/movielists?open=tomorrow <- 오픈이 내일인 영화 목록 GET
    [https://(사이트](https://사이트) 주소)/movie-reservation        <- 영화 예약을 POST
    
    물론 위 예시에서 GET인지 POST인지는 명사형 네이밍만 보고는 확신할 수 없다.
    하지만 API 문서를 보면 어떤 명령어가 어떤 기능을 하는지 알 수 있고, 그에 맞춰서 쓰면 된다.
  • REST API 자체에 대한 간단한 이해
    • API란?
      • 정보를 주고 받을 때 개발자들 사이에 널리 지켜지는 약속(형식)
      • API: 소프트웨어가 다른 소프트웨어로부터 지정된 형식으로 요청, 명령을 받을 수 있는 수단
    • REST API란?
      • HTTP 요청을 보낼 때 어떤 URI에 어떤 HTTP 메서드를 사용할지 개발자들 사이에 널리 지켜지는 약속
      • 각 요청이 어떤 동작이나 정보를 위한 것인지 그 요청의 모습 자체로 추론 가능
      • GET만으로도, POST만으로도 CRUD 모두 가능하다.
        • 그러려면 URI에 create, read, update, delete 같은 동작까지 명시해야 한다.
      • 하지만, 누가 봐도 무엇을 하는 건지 이해할 수 있도록 하기 위해서는 HTTP 메서드를 목적에 따라 구분해서 사용해야 한다.
    • 진정한 REST API에 대한 더 깊은 설명

참고

앨런 Swift문법 마스터 스쿨 (온라인 BootCamp - 2개월과정) - 인프런 | 강의
REST API가 뭔가요?

profile
풋사과 iOS 개발자

0개의 댓글