# FlutterFlow

A FlutterFlow lefordul egy alkalmazássá, amelyet a felhasználód tart a kezében, így a kérdés nem az, hogy mely mezőket töltsd ki, hanem hogy hol kerül a kulcs. Az alábbi kérés a production környezetbe pontosan úgy lett elküldve, ahogy a hívás összeállítja; a FlutterFlow lépések a FlutterFlow dokumentációja szerint 2026-09-17 állapotában íródtak.

Először hozd létre a kulcsot, ahogy a [Kulcs az automatizáláshoz](/integrations/#ключ-для-автоматизації) részben le van írva, a `chart` területtel.

<Aside type="caution" title="Kulcs a szokásos hívásban együtt jár az alkalmazással">
A nem privátnak jelölt hívás az eszközről fut, és a fejléce a lefordított iOS, Android és web buildben van, ahol bárki elolvashatja. Tedd a hívást **priváttá**: ekkor a FlutterFlow a Firebase Cloud Function-en keresztül hajtja végre, és a kulcs a szerveren marad. A FlutterFlow saját ellenőrzése az, hogy letölti a projekt kódját és megkeresi a kulcsot a frontend fájlokban, ami csak fizetős tarifán érhető el.
</Aside>

## 1. Hozd létre a hívást

Nyisd meg a **API Calls**-t, kattints a **+ Add**-ra, válaszd a **Create API Call**-t és töltsd ki:

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

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

- A **Headers** fülön, **+ Add Header**: egy sor `X-Api-Key: ` és utána a te kulcsod. A másik sor `Content-Type: application/json`.
- A **Variables** fülön: öt String típusú változó, `date`, `time`, `timezone`, `latitude`, `longitude`, mindegyik a lenti JSON-ból származó alapértelmezett értékkel.
- A **Body** fülön, a legördülő **JSON** listában: illeszd be a JSON-t és húzd be a változókat.

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

A szélesség és hosszúság sztringként marad szándékosan: az API `"50.45"`-t számként fogadja, de a sztring egyszerűsíti a változók húzását.

Kattints a **Add Call**-ra, nyisd meg a **Response & Test**-et, kattints a **Test API Call**-ra és nézd meg a választ a **Test Response**-ban. A `data.input.timezoneOffset` `4`-ként tér vissza: ez a Kyiv időeltolás volt az adott napon.

## 2. Tedd a hívást priváttá

A hívás **Advanced Settings**-ében kapcsold be a **Make Private**-t, kattints a **Save**-ra, majd a **Deploy APIs**-re. Most a hívás a Firebase Cloud Function-ben fut, ezért a projektnek csatlakoztatott Firebase-re és egy Firebase tarifára Cloud Functions-szal van szüksége.

<Aside type="caution" title="A privát hívások nem öröklik a csoport fejléceit">
Ha a kulcsot a **API Group**-ra helyezed, nem a hívásra, a FlutterFlow abbahagyja annak küldését abban a pillanatban, amikor a hívás priváttá válik: a csoport fejlécei nem öröklődnek a privát hívásokra. Add hozzá az `X-Api-Key`-t a híváshoz, különben az első privát futtatás `401`-et ad.
</Aside>

Még két dolog, amit a FlutterFlow dokumentáció egyértelműen mond: a frontendről (például remote config-on keresztül) átadott kulcs nyitva marad még a privát hívásnál is, és a biztonságos forma a hívásba beágyazott fejléc.

## 3. Olvasd el a választ

A **JSON Paths**-nél kattints a **+ Add JSON Path**-ra és adj nevet mindegyiknek:

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

A jel a hosszúság, 30-cal osztva és lefelé kerekítve, mint index a tizenkét név listájában: például a `159.26` Aszcendenst `5`-öt ad, vagyis Szűz. Elég egy négy soros egyedi függvény vagy egy tizenkét soros lista és az index.

## A web build nem tud a böngészőből hozzánk fordulni

2026-09-17-én egy külső domainről származó oldalról mérve: a `POST /v1/chart` preflight-re válaszol `access-control-allow-origin` fejléc nélkül, és a Chrome blokkolja a kérést. A böngészőnek egy másik domainen csak a `/v1/public/*` és `/v1/embed/*` válaszol.

A FlutterFlow a hívásokat saját proxy-n keresztül hajtja végre a tervezőben, a Run és Test módban, így egy ott működő hívás a webalkalmazás közzététele után is elbukhat. Két megoldás van, és az elsőt javasoljuk:

- **Tedd a hívást priváttá**, ahogy fent. Így a Cloud Function-ben fut, nem a böngészőben, és ez egyből megoldja a kulcs és a CORS kérdéseket.
- **Állíts be saját backendet** előttünk, ha már van. A FlutterFlow proxy beállítása, saját proxy URL-lel, dokumentált a tervezőben és a Run és Test módokban; a közzétett web buildről a dokumentáció semmit sem mond, így nem érdemes rá számítani.

A nyilvános `pk_` kulcs nem oldja meg ezt: csak a `/v1/public/*` és `/v1/embed/*` útvonalakat érheti el, és az iOS és Android buildek teljesen elutasítják, mert nem küldenek web-origin-t.

## Hibák

- **`401`** privát hívásnál: a kulcs a csoporton van, nem a híváson.
- **`400 INVALID_FIELD` a `timezone`-nál a `details`-ben**: a zóna üres, ez egy rövidítés, pl. `EST`, vagy nem egy zóna neve.
- **`400` a `date` vagy `time`-nál a `details`-ben**: formátum nem `YYYY-MM-DD` / `HH:MM:SS`.
- **`403 ENDPOINT_NOT_IN_SCOPE`**: a kulcs területén nincs `chart`.
- **`429 KEY_BUDGET_EXHAUSTED`**: a kulcs kimerítette a saját költségkeretét; emeld a dashboardon.

<Aside type="note">
Az ingyenes FlutterFlow tarif két API endpointot engedélyez projektenként, és nincs OpenAPI import, így a hívást kézzel kell hozzáadni, és egy slot marad. Az API nem geokódol: a koordinátákat a saját mezőidből vagy egy geokódoló szolgáltatásból veszi, amelyhez van kulcsod.
</Aside>
