Milky's note

[Python] URL encoding (request 파라미터 ASCII 변환) 본문

Python/요약 정리

[Python] URL encoding (request 파라미터 ASCII 변환)

밀뿌 2024. 3. 26. 21:10

 

 

요즘 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도 잘 불러왔다.

 

Comments