MINRYUL
류링류링
MINRYUL
전체 방문자
오늘
어제
  • 분류 전체보기
    • Swift
      • 학습
    • iOS
      • Toy-Project
      • 학습
      • Metal
    • CS
    • TIL

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • TDD
  • Custom Calendar
  • collectionView
  • Clean Architecture
  • configuration_bulid_dir
  • dynamic frameworkm
  • BDD
  • some
  • Protocol
  • CollectionView Cell
  • urlsession
  • Existential any
  • demangle
  • ios
  • Swift
  • ViewStore
  • RxNimble
  • Any
  • WWDC 2024
  • RxCocoa
  • RxSwift
  • opaque type
  • static framework
  • TableView Cell
  • METAL
  • AttributeText
  • WWDC
  • RxTest
  • tuist
  • Existential type

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
MINRYUL

류링류링

CS

HTTP multipart/form-data

2022. 5. 10. 21:02

HTTP Request

 

 multipart/form-data는 HTTP의 Content-Type 중 하나이다.

HTTP Request는 다음과 같이 4가지로 나눌 수 있다.

HTTP Request

 위 4가지 중에서 Message Body에 어떠한 타입이 들어갈 수 있는지 명시해 줄 수 있는 것이 Content Type이고, Header Field에 보내어진다. 이 같은 구조는 어플리케이션이나 웹 단에서 서버에게 API를 요청할때 이러한 구조를 갖는다. Content Type에서 Text 타입으로는 text/css, text/javascript, text/html, text/plain이 있고, file을 실어 보내기 위해서는 multipart/form-data를 사용한다. 어플리케이션 타입으로 aplication/json, application/x-www-urlencoded가 있다.

 

multipart/form-data

 

 일반적인 HTTP Request의 Body는 한 종류의 타입을 지원하는 것이 대부분이다. 하지만 사진이나, 동영상을 업로드할 경우 이 사진이 무엇인지 설명할 수 있는 input 이 들어가야 할 수 있다. 따라서 Body에 여러가지 타입이 들어가야한다면 input의 형식이 다르기 때문에 일반적인 HTTP Request의 형식으로는 전송할 수 없어 HTTP Request Body로 여러 종료의 데이터를 구분해서 넣는 방법인 multipart라는 개념이 등장하게 된다.

 

 multipart는 MIME(Multipurpose Internet Mail Extensions) 타입 중 하나 이다. MIME은 여러 멀티미디어 데이터들의 바이너리 데이터를 ASCII 코드로 변환하는 방법(인코딩)과 미디어 종류를 MIME 타입 목록으로 정의 했고, MIME 사양에 따라 멀티미디어 파일의 데이터를 ASCII 데이터로 인코딩 후 전송한다. 즉, 송신측에서는 보낼 타입에 맞춰 MIME 타입을 기록해서 인코딩 후 송신하고, 수신 측에서는 송신측이 보낸 MIME 타입을 참고해서 본래의 파일로 디코딩 하는 것.

 multipart의 문서 형식은 경계('--' (이중 대쉬) + Boundary)로 구분되는 다른 파트들로 구성된다. 개발자는 Boundary를 직접 포함 시킬 수 있다. Boundary를 포함시키는 것은 개발자의 선택. Bounary는 '--' 이중 대쉬와 함께("--Bounary") file data를 구분하는 역할을 한다.(header와 header를 구분하는 것은 개행문자.) 따라서 메세지의 시작과 끝 부분에 나타나고, 본문과의 충돌을 피하기위해 UUID와 같은 메세지와 구분될 수 있는 유니크한 Text를 사용한다. Bounary 메세지의 마지막에는 '--' 이중 대쉬가 붙는데, 이것은 body의 끝을 알리는 의미이다.("--Bounary--") 송신측이 보내는 데이터가 아주 크거나 여러 개의 파일을 전송할때 Body 정보가 여러 개의 패킷으로 쪼개져서 보내지게 된다.

 

iOS에서의 Multipart/form-data

    func uploadDocument(
    	requestURL: String,
        fileData: FileData, 
        completionHandler : @escaping (AFDataResponse<Data>
        ) -> Void) {
        
        let parameters = [
            "userId" : fileData.userId,
            "outSourceId" : fileData.outSourceId
        ]
        
        AF.upload(multipartFormData: { multipartFormData in
            // zip파일 넣어주기
            multipartFormData.append(
            fileData.file, withName: "file",
            fileName: fileData.fileName,
            mimeType: "application/zip"
            )
            // body를 넣어주기
            for (key, value) in parameters {
                multipartFormData.append(
                "\(value)".data(using: .utf8)!,
                withName: key, 
                mimeType: "text/plain"
                )
            }
        }, to: requestURL, method: .post)
        .responseData(completionHandler: completionHandler)
    }

 Alamofire의 예제이다. 전송할 데이터를 withName, fileName, mimeType에 맞춰서 구체 타입이 아닌 Data 형식으로 맞춰 전송한다. URLSession을 사용하게 되면 개발자가 직접 Body에 구분자와 문자열을 넣어줘야 하지만, Alamofire 같은 잘 추상화 된 라이브러리를 사용하면 이러한 작업 리소스를 줄일 수 있으므로 사용되는 것 같다.

 

참고 자료

https://www.aisangam.com/blog/http-request-message-format-well-explained/

 

HTTP Request Message format well explained - AI SANGAM

INTRODUCTION HTTP request message contains request line, header fields and optional message data. Request line tells what type of data to be retrieved or updated at the specific web server resources. An http request header is a component of data which is r

www.aisangam.com

https://lena-chamna.netlify.app/post/http_multipart_form-data/

 

HTTP multipart/form-data 이해하기

Understanding about HTTP multipart/form-data

lena-chamna.netlify.app

https://lng1982.tistory.com/209

 

HTTP multipart/form-data raw 데이터는 어떤 형태일까?

Apache HTTP Client를 이용하여 multipart/form-data content-type으로의 요청을 서버로 보내는 유틸을 개발하게 되었다. 흔히 웹 브라우저에서 파일 첨부를 한 후 "저장하기" 버튼을 클릭했을 때의 동작을 Java.

lng1982.tistory.com

 

'CS' 카테고리의 다른 글

Protocol Buffer  (0) 2022.08.03
TDD와 BDD  (1) 2022.05.31
    'CS' 카테고리의 다른 글
    • Protocol Buffer
    • TDD와 BDD
    MINRYUL
    MINRYUL
    열심히 살자

    티스토리툴바