Spaces:
Building
Building
Update api_executor.py
Browse files- api_executor.py +57 -2
api_executor.py
CHANGED
@@ -149,14 +149,69 @@ def _ensure_token(api: APIConfig, session: Session) -> None:
|
|
149 |
# Refresh failed, get new token
|
150 |
_fetch_token(api, session)
|
151 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
152 |
def call_api(api: APIConfig, session: Session) -> requests.Response:
|
153 |
"""Execute API call with automatic token management"""
|
154 |
# Ensure valid token
|
155 |
_ensure_token(api, session)
|
156 |
|
157 |
-
# Prepare
|
158 |
headers = _render(api.headers, session, api.name)
|
159 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
160 |
|
161 |
# Handle proxy
|
162 |
proxies = None
|
|
|
149 |
# Refresh failed, get new token
|
150 |
_fetch_token(api, session)
|
151 |
|
152 |
+
def _render_json_preserving_types(obj: Any, session: Session, api_name: str) -> Any:
|
153 |
+
"""Render JSON object while preserving variable types"""
|
154 |
+
if isinstance(obj, str):
|
155 |
+
# String içinde template var mı kontrol et
|
156 |
+
if '{{' in obj and '}}' in obj:
|
157 |
+
# Tam template mi kontrol et (örn: "{{variables.count}}" değil de {{variables.count}})
|
158 |
+
template_match = _placeholder.match(obj.strip())
|
159 |
+
if template_match and template_match.group(0) == obj.strip():
|
160 |
+
# Bu tam bir template, tipi koru
|
161 |
+
key = template_match.group(1)
|
162 |
+
if key.startswith("variables."):
|
163 |
+
var_name = key.split(".", 1)[1]
|
164 |
+
value = session.variables.get(var_name)
|
165 |
+
|
166 |
+
# Değer tipini koru
|
167 |
+
if value is None:
|
168 |
+
return None
|
169 |
+
elif isinstance(value, bool):
|
170 |
+
return value
|
171 |
+
elif isinstance(value, (int, float)):
|
172 |
+
return value
|
173 |
+
elif isinstance(value, str):
|
174 |
+
# Date string'leri olduğu gibi bırak
|
175 |
+
return value
|
176 |
+
else:
|
177 |
+
return str(value)
|
178 |
+
else:
|
179 |
+
# String içinde template var, string olarak render et
|
180 |
+
return _render(obj, session, api_name)
|
181 |
+
else:
|
182 |
+
# Template yok, olduğu gibi dön
|
183 |
+
return obj
|
184 |
+
elif isinstance(obj, dict):
|
185 |
+
return {k: _render_json_preserving_types(v, session, api_name) for k, v in obj.items()}
|
186 |
+
elif isinstance(obj, list):
|
187 |
+
return [_render_json_preserving_types(v, session, api_name) for v in obj]
|
188 |
+
else:
|
189 |
+
# Diğer tipler (int, float, bool, None) olduğu gibi
|
190 |
+
return obj
|
191 |
+
|
192 |
def call_api(api: APIConfig, session: Session) -> requests.Response:
|
193 |
"""Execute API call with automatic token management"""
|
194 |
# Ensure valid token
|
195 |
_ensure_token(api, session)
|
196 |
|
197 |
+
# Prepare headers (bunlar her zaman string)
|
198 |
headers = _render(api.headers, session, api.name)
|
199 |
+
|
200 |
+
# Body template'i özel olarak handle et
|
201 |
+
body = api.body_template
|
202 |
+
|
203 |
+
# Eğer body_template bir dict ise (JSON object)
|
204 |
+
if isinstance(body, dict):
|
205 |
+
# Doğrudan render et
|
206 |
+
body = _render_json_preserving_types(body, session, api.name)
|
207 |
+
elif isinstance(body, str):
|
208 |
+
# String ise, JSON olup olmadığını kontrol et
|
209 |
+
try:
|
210 |
+
parsed_body = json.loads(body)
|
211 |
+
body = _render_json_preserving_types(parsed_body, session, api.name)
|
212 |
+
except:
|
213 |
+
# JSON değilse, normal string render
|
214 |
+
body = _render(body, session, api.name)
|
215 |
|
216 |
# Handle proxy
|
217 |
proxies = None
|