본문 바로가기
Python/Common

[Python] 파이썬 Requests로 "multipart/form-data" Post 하는 법

by jiyoon_92 2022. 6. 15.
반응형

python

 이 글을 포스팅하게 된 이유는 일종의 기록용이기도 하지만 검색했을 때 한 번에 찾아지지 않았던 방법이라 공유하고 싶어서 쓰게 되었다. 

기존에 Json 포맷으로 Request/Response 하는 법은 많지만 "multipart/form-data"의 포맷으로 데이터를 주고 받는 건 처음 해보는 터라 몇 번의 시행착오가 있었다.  보내고자 하는 정보를 dict로 생성하여 requests.post(Files="")의 인자로 넘긴다던가 하는 방법들은 해봤지만 정상적으로 동작하지 않았다. 

 

여러 가지 방법을 찾은 끝에 requests_toolbelt의 MultipartEncoder를 설치하여 multipart/form-data 형식으로 인코딩하고 Post할 때 data로 넘겨주면 정상적으로 작동했다.


multipart/form-data 란?

HTTP Request의 body의 타입을 말한다. 보통 header에 "Content-Type" : "multipart/form-data"라고 명시한다.

form : 입력 양식 전체를 감싸는 태그
form-data : form 안에 있는 컨트롤들의 데이터
multipart : 일반적으로 body에서는 하나의 타입을 갖지만 여러 input의 데이터들이 각기 다른 데이터 타입을 갖는 경우 multipart라는 타입으로 지정한다. (일반적으로는 text면 text/plain, xml이면 text/xml, jpg면 image/jpg)

 


PIP로 "Requests, Reqeusts_toolbelt" 설치

Python으로 HTTP Request, Response를 주고받기 위해 requests 라이브러리를 설치한다. 여기까지는 get/post 방식을 이용한 통신을 할 수 있으며 multipart/form-data 형식으로 주고 받는 데이터를 인코딩하기 위해 reqeusts_toolbelt를 설치 한다.

requests 설치
requests_toolbelt 설치

반응형

코드

from requests_toolbelt import MultipartEncoder
import requests
import json

def post(url, field_data) :
    m = MultipartEncoder(fields=field_data)
    headers = {'Content-Type' : m.content_type}
    res = requests.post(url, headers=headers, data=m)
    return res.status_code, res.json()
    
def get_login_info(cust_num, id, pw) :
    field = {'appType':'P', 'custNum' : cust_num, 'userID': id, 'userPW': pw }
    return post('https://test.test.test/Account/Login', field)
  1. Field에 login API에서 요구하는 데이터를 dict 형식{ key : value }으로 생성한다.
  2. MultipartEncoder를 이용하여 field 데이터를 인코딩한 후 헤더 정보의 content-type을 multipart/form-data로 변경한다.
  3. request.post() 함수에 url, header, 인코딩 된 데이터를 넣어준다.
  4. reponse로 현재 상태 코드를 받고 reponse data를 json() 함수를 이용하여 json 포맷으로 변형한다.

*MultipartEncoder(fields, boundary=None, encoding='utf-8') 사용법

  fields는 인코딩할 데이터 (dict {} 형식)고 boundary는 각 메시지를 구분 지을 문자열(보통 무작위)이며 encoding은 인코딩할 방식을 넣는다.

 

 

이번 문제를 해결하면서 Python으로 서버랑 통신하는 법을 배우고 있는데 단순한 get/post 방식으로 데이터만 주고받는 것을 생각하다가 새로운 개념? 을 얻고 실제로 작성한 코드로 포스팅까지 할 수 있게 되어 좋았다. 누군가에게 도움이 될 수 있길 바라며~~

반응형

댓글