# FlutterFlow

FlutterFlow kompiluje się do aplikacji, którą trzyma w ręku twój użytkownik, więc pytanie nie dotyczy, które pola wypełnić, a gdzie znajdzie się klucz. Żądanie poniżej zostało wysłane do produkcji dokładnie w tej formie, w jakiej je konstruuje wywołanie; kroki w FlutterFlow zostały napisane zgodnie z dokumentacją FlutterFlow z dnia 2026-09-17.

Najpierw utwórz klucz, jak opisano w sekcji [Klucz do automatyzacji](/integrations/#ключ-для-автоматизації), z zakresem `chart`.

<Aside type="caution" title="Klucz w zwykłym wywołaniu jedzie razem z aplikacją">
Wywołanie, nieoznaczone jako prywatne, jest wykonywane z urządzenia, a jego nagłówek znajduje się wewnątrz skompilowanej wersji dla iOS, Androida i sieci web, gdzie każdy może go przeczytaj. Zrób wywołanie **prywatne**: wtedy FlutterFlow przeprowadza je przez Firebase Cloud Function, a klucz pozostaje na serwerze. Własna weryfikacja FlutterFlow polega na pobraniu kodu projektu i poszukaniu klucza w plikach frontendu, a jest dostępna tylko w płatnym planie.
</Aside>

## 1. Utwórz wywołanie
Otwórz **API Calls**, kliknij **+ Add**, wybierz **Create API Call** i wypełnij:
- **Nazwa wywołania API**: `Natal chart`.
- **Typ metody**: `POST`.
- **URL**:

```
  https://api.astroway.info/v1/chart
  ```
- Zakładka **Headers**, **+ Add Header**: jeden wiersz `X-Api-Key: ` a następnie twój klucz. Drugi wiersz `Content-Type: application/json`.
- Zakładka **Variables**: pięć zmiennych typu String, `date`, `time`, `timezone`, `latitude`, `longitude`, każda z domyślną wartością z JSON poniżej.
- Zakładka **Body**, w losowej liście **JSON**: wklej JSON i przeciągnij do niego zmienne.

```json
{
  "date": "1990-05-15",
  "time": "14:30:00",
  "timezone": "Europe/Kyiv",
  "latitude": "50.45",
  "longitude": "30.52"
}
```
Szerokość i długość pozostają ciągami znaków celowo: API akceptuje `"50.45"` jako liczbę, a ciąg upraszcza przeciąganie zmiennych.
Kliknij **Add Call**, otwórz **Response & Test**, kliknij **Test API Call** i zobacz odpowiedź w **Test Response**. `data.input.timezoneOffset` zwraca wartość `4`: dokładnie taki przesunięcie miało miejsce w Kijowie tego dnia.

## 2. Zrób wywołanie prywatne
W **Advanced Settings** wywołania włącz **Make Private**, kliknij **Save**, a następnie **Deploy APIs**. Teraz wywołanie jest wykonywane w Firebase Cloud Function, więc projekt wymaga podłączonego Firebase oraz planu Firebase z Cloud Functions.
<Aside type="caution" title="Prywatne wywołania nie dziedziczą nagłówków grupy">
Jeśli umieścisz klucz w **API Group**, a nie na samym wywołaniu, FlutterFlow przestanie go wysyłać w tym samym momencie, gdy wywołanie stanie się prywatne: nagłówki grupy nie są dziedziczone przez prywatne wywołania. Dodaj `X-Api-Key` do samego wywołania, w przeciwnym razie pierwsze prywatne uruchomienie zwróci `401`.
</Aside>

Dwie dodatkowe rzeczy, o których dokumentacja FlutterFlow mówi bezpośrednio: klucz przesyłany z frontendu, na przykład przez remote config, pozostaje otwarty nawet w prywatnym wywołaniu, a bezpieczna forma to nagłówek wpisany w samo wywołanie.

## 3. Przeczytaj odpowiedź
W **JSON Paths** kliknij **+ Add JSON Path** i nadaj każdemu nazwę:
| Nazwa | JSON Path |
|---|---|
| `ascendant` | `$.data.houses.ascendant` |
| `sunLongitude` | `$.data.planets[0].longitude` |
| `moonLongitude` | `$.data.planets[1].longitude` |
| `offsetUsed` | `$.data.input.timezoneOffset` |
Znak to długość podzielona przez 30 i zaokrąglona w dół, jako indeks w liście dwunastu nazw: na przykład Ascendant `159.26` daje `5`, czyli Panna. Wystarczy własna funkcja czterech linii lub lista dwunastu linii i indeks.

## Kompilacja sieciowa nie może się komunikować z nami z przeglądarki
Zmierzono 2026-09-17 ze strony na obcym domenie: `POST /v1/chart` odpowiada na preflight bez nagłówka `access-control-allow-origin`, a Chrome blokuje żądanie. Przeglądarka na obcym domenie odpowiada tylko na `/v1/public/*` i `/v1/embed/*`.
FlutterFlow przeprowadza wywołania przez własny proxy w konstruktorze, w trybie Run i Test, więc wywołanie, które tam działa, może nie powieść się po publikacji aplikacji internetowej. Dwa rozwiązania, a pierwsze zalecamy:
- **Zrób wywołanie prywatne**, jak wyżej. Wtedy jest wykonywane w Cloud Function, a nie w przeglądarce, i od razu rozwiązuje to zarówno problem klucza, jak i problem CORS.
- **Umieść przed nami własny backend**, jeśli już go masz. Konfiguracja proxy w FlutterFlow, razem z własnym adresem URL proxy, jest udokumentowana dla konstruktora oraz trybów Run i Test; dotyczące opublikowanej kompilacji sieciowej dokumentacja nic nie mówi, więc nie można na nich polegać.
Publiczny klucz `pk_` tego nie rozwiązuje: uzyskuje dostęp tylko do `/v1/public/*` i `/v1/embed/*`, a kompilacje dla iOS i Android są całkowicie odrzucane, ponieważ nie wysyłają pochodzenia sieciowego.

## Błędy
- **`401`** przy prywatnym wywołaniu: klucz znajduje się w grupie, a nie w wywołaniu.
- **`400 INVALID_FIELD`** z `timezone` w `details`**: strefa jest pusta, to skrót typu `EST` lub niepoprawna nazwa strefy.
- **`400`** z `date` lub `time` w `details`**: format nie jest `YYYY-MM-DD` / `HH:MM:SS`.
- **`403 ENDPOINT_NOT_IN_SCOPE`**: w zakresie klucza brak `chart`.
- **`429 KEY_BUDGET_EXHAUSTED`**: klucz wyczerpał własny budżet; zwiększ go w panelu.
<Aside type="note">
Bezpłatny plan FlutterFlow pozwala na dwa punkty końcowe API w projekcie i nie obsługuje importu OpenAPI, dlatego na nim wywołanie jest dodawane ręcznie, a pozostaje jeszcze jeden slot. API nie wykonuje geokodowania: współrzędne są pobierane z własnych pól lub z usługi geokodowania, do której masz klucz.
</Aside>
