# FlutterFlow

FlutterFlow bir uygulamaya derlenir ve bu uygulamayı kullanıcıların elinde tutar, bu yüzden sorun hangi alanları doldurmakta değil, anahtarın nerede bulunacağıdır. Aşağıdaki istek, üretim ortamına tam olarak çağrının oluşturduğu şekilde gönderilir; FlutterFlow adımları 2026-09-17 tarihli FlutterFlow belgelerine göre yazılmıştır.

İlk olarak, [Otomasyon Anahtarı](/integrations/#ключ-для-автоматизації) bölümünde açıklandığı gibi, `chart` alanı ile bir anahtar oluştur.

<Aside type="caution" title="Anahtar normal çağrıda uygulama ile birlikte gider">
Özel olarak işaretlenmemiş bir çağrı, cihazdan çalıştırılır ve başlığı iOS, Android ve web için derlenmiş paket içinde bulunur; bu başlığı herkes okuyabilir. Çağrıyı **özel** yap: böylece FlutterFlow onu Firebase Cloud Function üzerinden yürütür ve anahtar sunucuda kalır. FlutterFlow'un kendi kontrolü, proje kodunu indirip ön uç dosyalarında anahtarı aramaktır ve bu sadece ücretli tarifede mevcuttur.
</Aside>

## 1. Çağrıyı Oluştur

**API Calls**'ı aç, **+ Add**'e tıkla, **Create API Call**'ı seç ve doldur:

- **API Call Name**: `Natal chart`.
- **Method Type**: `POST`.
- **URL**:

  ```
  https://api.astroway.info/v1/chart
  ```

- Sekme **Headers**, **+ Add Header**: bir satır `X-Api-Key: ` ve ardından anahtarınız. İkinci satır `Content-Type: application/json`.
- Sekme **Variables**: `date`, `time`, `timezone`, `latitude`, `longitude` olmak üzere beş adet String değişken, her biri aşağıdaki JSON'dan varsayılan değere sahip.
- Sekme **Body**, açılır listeden **JSON** seçeneği: JSON'u yapıştır ve değişkenleri içine sürükle.

```json
{
  "date": "1990-05-15",
  "time": "14:30:00",
  "timezone": "Europe/Kyiv",
  "latitude": "50.45",
  "longitude": "30.52"
}
```

Enlem ve boylam kasıtlı olarak string olarak bırakılır: API `"50.45"` değerini sayı olarak kabul eder, ancak string değişkenlerin sürüklenmesini kolaylaştırır.

**Add Call**'a tıkla, **Response & Test**'i aç, **Test API Call**'a tıkla ve yanıtı **Test Response**'da gör. `data.input.timezoneOffset` `4` olarak döner: Kiev'in o tarihteki saat dilimi kayması budur.

## 2. Çağrıyı özel yap

**Advanced Settings** içinde çağrının **Make Private** seçeneğini aç, **Save**'e tıkla, ardından **Deploy APIs**. Artık çağrı Firebase Cloud Function içinde çalışır, bu yüzden proje bağlı bir Firebase ve Cloud Functions içeren bir Firebase tarifesine ihtiyaç duyar.

<Aside type="caution" title="Özel çağrılar grup başlıklarını devralmaz">
Anahtarı **API Group**'a, çağrıya değil koyarsan, FlutterFlow onu özel hale geldiği anda göndermeyi durdurur: grup başlıkları özel çağrılarla devralınmaz. `X-Api-Key`'i doğrudan çağrıya ekle, aksi takdirde ilk özel çalıştırma `401` dönecektir.
</Aside>

FlutterFlow belgelerinin doğrudan söylediği iki şey daha var: ön uçtan, örneğin remote config üzerinden gönderilen anahtar, özel çağrıda bile açık kalır; güvenli form ise başlık olarak doğrudan çağrıya eklenmiş halidir.

## 3. Yanıtı Oku

**JSON Paths** içinde **+ Add JSON Path**'e tıkla ve her birine bir isim ver:

| İsim | JSON Path |
|---|---|
| `ascendant` | `$.data.houses.ascendant` |
| `sunLongitude` | `$.data.planets[0].longitude` |
| `moonLongitude` | `$.data.planets[1].longitude` |
| `offsetUsed` | `$.data.input.timezoneOffset` |

İşaret, 30'a bölünmüş ve aşağı yuvarlanmış uzunluktur, bu 12 isimlik bir listedeki indeks gibidir: örneğin Ascendant `159.26` `5` verir, yani Başak. Dört satırlık bir özel fonksiyon ya da 12 satırlık bir liste ve indeks yeterlidir.

## Web derlemesi tarayıcıdan bize erişemez

2026-09-17 tarihinde dış bir alan adındaki bir sayfadan ölçüldü: `POST /v1/chart` preflight isteğine `access-control-allow-origin` başlığı olmadan yanıt veriyor ve Chrome isteği engelliyor. Dış alan adındaki tarayıcı yalnızca `/v1/public/*` ve `/v1/embed/*`'e yanıt alıyor.

FlutterFlow, Run ve Test modlarında, tasarımcı içinde kendi proxy'si üzerinden çağrılar yapar, bu yüzden orada çalışan bir çağrı, web uygulaması yayınlandıktan sonra başarısız olabilir. İki çözüm var ve ilkini öneriyoruz:

- **Çağrıyı özel yap**, yukarıdaki gibi. Böylece Cloud Function içinde çalışır, tarayıcıda değil ve hem anahtar hem de CORS sorunu anında çözülür.
- **Kendi backend'inizi bize koyun**, zaten varsa. FlutterFlow'da proxy ayarları, kendi proxy URL'nizle birlikte, tasarımcı ve Run/Test modları için belgelenmiştir; yayınlanmış web derlemesi hakkında dokümantasyon bir şey söylemez, bu yüzden onlara güvenmemelisiniz.

Public anahtar `pk_` bu sorunu çözmez: sadece `/v1/public/*` ve `/v1/embed/*` alır, iOS ve Android derlemelerinden ise tamamen reddedilir, çünkü web-origin göndermezler.

## Hatalar

- **`401`** özel çağrıda: anahtar grup üzerinde, çağrı üzerinde değil.
- **`400 INVALID_FIELD` `timezone` içinde `details`**: bölge boş, bu `EST` gibi bir kısaltma ya da bölge adı değil.
- **`400` `date` veya `time` içinde `details`**: format `YYYY-MM-DD` / `HH:MM:SS` değil.
- **`403 ENDPOINT_NOT_IN_SCOPE`**: anahtar alanında `chart` yok.
- **`429 KEY_BUDGET_EXHAUSTED`**: anahtar bütçesini tüketti; kontrol panelinden artır.

<Aside type="note">
Ücretsiz FlutterFlow tarifesi proje başına iki API uç noktası izin verir ve OpenAPI içe aktarma yoktur, bu yüzden çağrı elle eklenir ve bir slot daha kalır. API coğrafi kodlama yapmaz: koordinatlar kendi alanlarınızdan veya sahip olduğunuz bir coğrafi kodlama servisinin anahtarından alınır.
</Aside>
