Spaces:
Building
Building
Update api_executor.py
Browse files- api_executor.py +46 -0
api_executor.py
CHANGED
@@ -187,6 +187,7 @@ def call_api(api: APIConfig, session: Session) -> requests.Response:
|
|
187 |
# Execute with retry
|
188 |
retry_count = api.retry.retry_count if api.retry else 0
|
189 |
last_error = None
|
|
|
190 |
|
191 |
for attempt in range(retry_count + 1):
|
192 |
try:
|
@@ -204,6 +205,51 @@ def call_api(api: APIConfig, session: Session) -> requests.Response:
|
|
204 |
|
205 |
response.raise_for_status()
|
206 |
log(f"✅ API call successful: {api.name} ({response.status_code})")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
207 |
return response
|
208 |
|
209 |
except requests.exceptions.Timeout as e:
|
|
|
187 |
# Execute with retry
|
188 |
retry_count = api.retry.retry_count if api.retry else 0
|
189 |
last_error = None
|
190 |
+
response = None
|
191 |
|
192 |
for attempt in range(retry_count + 1):
|
193 |
try:
|
|
|
205 |
|
206 |
response.raise_for_status()
|
207 |
log(f"✅ API call successful: {api.name} ({response.status_code})")
|
208 |
+
|
209 |
+
# Response mapping işlemi - başarılı her response için
|
210 |
+
if response.status_code in (200, 201, 202, 204) and hasattr(api, 'response_mappings') and api.response_mappings:
|
211 |
+
try:
|
212 |
+
# 204 No Content durumunda JSON parse etmeye çalışma
|
213 |
+
if response.status_code != 204 and response.content:
|
214 |
+
response_json = response.json()
|
215 |
+
|
216 |
+
for mapping in api.response_mappings:
|
217 |
+
var_name = mapping.get('variable_name')
|
218 |
+
var_type = mapping.get('type', 'str')
|
219 |
+
json_path = mapping.get('json_path')
|
220 |
+
|
221 |
+
if not all([var_name, json_path]):
|
222 |
+
continue
|
223 |
+
|
224 |
+
# JSON path'ten değeri al
|
225 |
+
value = response_json
|
226 |
+
for path_part in json_path.split('.'):
|
227 |
+
if isinstance(value, dict):
|
228 |
+
value = value.get(path_part)
|
229 |
+
if value is None:
|
230 |
+
break
|
231 |
+
|
232 |
+
if value is not None:
|
233 |
+
# Type conversion
|
234 |
+
if var_type == 'int':
|
235 |
+
value = int(value)
|
236 |
+
elif var_type == 'float':
|
237 |
+
value = float(value)
|
238 |
+
elif var_type == 'bool':
|
239 |
+
value = bool(value)
|
240 |
+
elif var_type == 'date':
|
241 |
+
# ISO format'ta sakla
|
242 |
+
value = str(value)
|
243 |
+
else: # str
|
244 |
+
value = str(value)
|
245 |
+
|
246 |
+
# Session'a kaydet
|
247 |
+
session.variables[var_name] = value
|
248 |
+
log(f"📝 Mapped response value: {var_name} = {value}")
|
249 |
+
|
250 |
+
except Exception as e:
|
251 |
+
log(f"⚠️ Response mapping error: {e}")
|
252 |
+
|
253 |
return response
|
254 |
|
255 |
except requests.exceptions.Timeout as e:
|