이 글을 포스팅하게 된 이유는 일종의 기록용이기도 하지만 검색했을 때 한 번에 찾아지지 않았던 방법이라 공유하고 싶어서 쓰게 되었다.
기존에 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를 설치 한다.
코드
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)
- Field에 login API에서 요구하는 데이터를 dict 형식{ key : value }으로 생성한다.
- MultipartEncoder를 이용하여 field 데이터를 인코딩한 후 헤더 정보의 content-type을 multipart/form-data로 변경한다.
- request.post() 함수에 url, header, 인코딩 된 데이터를 넣어준다.
- reponse로 현재 상태 코드를 받고 reponse data를 json() 함수를 이용하여 json 포맷으로 변형한다.
*MultipartEncoder(fields, boundary=None, encoding='utf-8') 사용법
fields는 인코딩할 데이터 (dict {} 형식)고 boundary는 각 메시지를 구분 지을 문자열(보통 무작위)이며 encoding은 인코딩할 방식을 넣는다.
이번 문제를 해결하면서 Python으로 서버랑 통신하는 법을 배우고 있는데 단순한 get/post 방식으로 데이터만 주고받는 것을 생각하다가 새로운 개념? 을 얻고 실제로 작성한 코드로 포스팅까지 할 수 있게 되어 좋았다. 누군가에게 도움이 될 수 있길 바라며~~
'Python > Common' 카테고리의 다른 글
[Python] Python 상위 폴더 경로 가져오기 (2) | 2022.08.31 |
---|---|
[Python] PyInstaller로 실행 파일(.exe) 만들기 (0) | 2022.06.17 |
[Python] Logging 모듈을 이용하여 Log 생성하는 법 (0) | 2022.06.16 |
[Python] PDF를 이미지로 변환하는 법 (Pdf2Image) (0) | 2022.06.09 |
댓글