일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- matplotlib
- 파이썬
- having
- 결측값
- SQLite
- Round
- 머신러닝
- SQL
- seaborn
- PostgreSQL
- Oracle
- MySQL
- 데이터리안 웨비나
- 전처리
- 데이터시각화
- GROUPBY
- SUM
- pandas
- 프로그래머스
- Limit
- 그로스해킹
- TRUNCATE
- solvesql
- 다중 JOIN
- not in
- mysql :=
- airflow 설치
- join
- hackerrank
- 데이터분석
- Today
- Total
Milky's note
[Python] URL encoding (request 파라미터 ASCII 변환) 본문
요즘 LinkedIn Ads API를 통해 ETL 로직을 개발하고 있다.
그런데 LinkedIn Ads의 API는 정말 당황스럽다.
docs도 잘 되어있지 않고 호출할 파라미터들은 중구난방이고
원하는 정보를 얻으려면 호출의 호출의 호출을 통해서 얻을 수 있었다...
그리고 무엇보다 request params들이 꼭 특수문자로"만" 들어와야지 호출이 된다.
(근데 campaign 관련 urn 파라미터는 아스키코드로"만" 들어와야지 호출가능 .. ㅎ)
그렇지 않으면 400(Bad Request) 오류가 떨어진다.
그래서 해결 방법을 찾은게 바로 urllib.parse 모듈의 urlencode 함수를 써서 특수문자들이
아스키 코드가 아닌 특수문자 그대로 처리되게 예외처리를 해주었다.
urlencode 함수는 str이나 bytes 객체를 포함할 수 있는 매핑 객체나 두 요소 튜플의 시퀀스를
퍼센트 인코딩된 ASCII 텍스트 문자열로 변환해준다.
이 때 결과 문자열을 urlopen() 함수를 사용하여 POST 연산을 위한 data로 사용하려면,
바이트열로 인코딩해야 하고 그렇지 않으면 TypeError가 발생한다.
👉 퍼센트 인코딩이란? URL 인코딩은 퍼센트 인코딩이라고도 불리며 URL에 문자를 표현하는 문자 인코딩 방법 알파벳이나 숫자 등 몇몇 문자를 제외한 나머지는 1바이트 단위로 묶인 16진수(ASCII)로 인코딩하는 방식 👉 해주어야하는 이유? GET 방식을 통해 HTTP 요청을 할 때 쿼리 파라미터가 붙는 경우가 생기는데 URL은 ASCII 코드값만 사용된다. 이 쿼리 파라미터에 한글이 포함될 경우, ASCII 코드만으로 표현을 할 수 없어서 인코딩을 해야한다. 호출하는 API마다 쿼리 파라미터에 한글 문자 그대로를 지원하는 경우도 있지만 그렇지 않은 경우도 있으므로 미리 인코딩을 거친 형식으로 전송하는 것이 바람직하다. |
사용 방법은 아래와 같다.
urllib.parse.urlencode(query, doseq=False, safe='',
encoding=None, errors=None, quote_via=quote_plus)
위 코드에서 query만 required 값이라 변환대상만 넣어주어도 되고
나의 경우 ASCII로의 변경을 막아야해서 safe 파라미터에 변환하지 않을 특수문자들을 넣어주었다.
파라미터 값이 괄호, 컴마, 콜론, 등호 등등이 있어서 해당하는 값들은 모두 넣어주었다.
campaigngroup_params = urllib.parse.urlencode(campaigngroup_params, safe='#\':()+=%,')
그리고 호출을 다시 한 결과 response code가 200으로 잘 호출이 되었고 원하는 resonse 값도 얻을 수 있었다.
Postman에는 저런 값들이 인코딩이 잘되어서 오류가 발생하지 않았는데 파이썬으로 호출할 때 발생하였고
오류를 잘 해결해서 API도 잘 불러왔다.
'Python > 요약 정리' 카테고리의 다른 글
[Python] AWS Glue에서 비동기 처리 (concurrent.futures) (1) | 2024.02.07 |
---|---|
[Pandas] 데이터프레임 컬럼 SHA256으로 암호화하기 (0) | 2024.01.08 |
[Pandas] 데이터프레임 컬럼 순서 변경 (1) | 2023.11.13 |
[Pandas] 데이터프레임 groupby로 연산된 컬럼 추가 (transform) (0) | 2023.11.13 |
[Python] timedelta(months=n) (2) | 2023.11.13 |