담당하고 있는 서비스의 FastAPI api 중에 세일즈포스 api 호출 로직을 포함하는 것이 있는데, API 호출이 성공하지 않았는데 에러 없이 작업이 완료되는 문제가 있었다.
외부 api 호출 과정 에서 에러가 나면 당연히 FastAPI 에서도 에러 상태를 반환하는 것으로 생각하고 개발했는데
아래 예시처럼 ccp api 의 response 를 받아올 뿐이어서,
Exception 처리가 필요함을 알게되었다.
HTTP/1.1 200
{
id: "unique-UUID-provided-by-SFMC"
key: "ixn-created-via-the-api"
name: "API-Created journey"
lastPublishedDate: "0001-01-01T00:00:00"
description: ""
workflowApiVersion: 1
createdDate: "2014-08-06T23:27:08.15"
modifiedDate: "2014-08-06T23:27:08.15"
triggers:[]
goals:[]
activities:[]
status: "Draft"
definitionId: "unique-UUID-provided-by-SFMC"
}
Exception 처리를 하던 중 400 이 뜨는 근본적인 원일을 제거하고자, reponse 를 출력해본 결과, CCP api 의 필수 파라미터인 name
에 특수문자가 들어가 validation error 가 일어난 것이었다.
>>> res.json()
그래서 ccp api 를 호출하는데 사용하는 커스텀 util class 코드에 name
파라미터의 밸류로 주는 str 에 특수문자를 대체하는 정규표현식 적용을 추가했다.
정규표현식은 아래 블로그를 참조했습니다.
re.sub(pattern, replacement, string)은 string에서 정규표현식의 pattern과 일치하는 내용을 replacement로 변경합니다. 만약 빈 문자열("")로 변경하면 패턴에 해당하는 문제만 제거하게 됩니다.
표현식 앞에 ^를 붙이면 not의 의미로, 그 정규표현식에 해당되지 않는 것을 찾습니다.
\uAC00-\uD7A30 : 모든 한글 음절(가-힣)
a-z : 영어 소문자
A-Z : 영어 대문자
0-9 : 숫자
\s : 띄어쓰기
import re
str = "AA**BB#@$CC 가나다-123"
new_str = re.sub(r"[^\uAC00-\uD7A30-9a-zA-Z\s]", "", str)
print(new_str)
OUTPUT:
AABBCC 가나다123
저의 경우 특수문자를 지워버리면 name 이 알아보기 어려워져서 언더바 _
로 치환하였고, 공백의 경우는 대체하지 않는 것으로 운영담당자 의견을 반영했습니다. (따라서 \s
는 삭제)
실제 코드와는 다른 예시 소스입니다.
import re
import requests
name = re.sub(r"[^\uAC00-\uD7A30-9a-zA-Z]", "_", item['name'])
# 여기서 item['name'] 은 요청으로 부터 받는 값
# 실무에서는 아래 코드를 모듈화하여 처리
url = f'https://{self._subdomain}.rest.marketingcloudapis.com/interaction/v1/interactions'
payloads = {
"key": key,
"name": name,
"workflowApiVersion": 1.0
"description": des,
"triggers": [],
"goals": [],
"activities": []
}
res = requests.post(url, headers=headers, json=payloads)
이로써 한 동안 시스템 상에서는 생성을 완료했는데, SalesforceMC 플랫폼 상에서는 journey 가 생성되지 않던 원인을 대응하게 되었다.
또 다른 예외로 재발생할지는 모르지만...
다른 예외가 발생한다면 재포스팅하려 한다 💭