ciyidogan commited on
Commit
8f0659d
·
verified ·
1 Parent(s): e2b0645

Update api_executor.py

Browse files
Files changed (1) hide show
  1. 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 request
158
  headers = _render(api.headers, session, api.name)
159
- body = _render(api.body_template, session, api.name)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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