Rest API
Integracja gier z platformą
Written By Coder Matthew
Last updated 6 months ago
1) Wprowadzenie
REST API (Representational State Transfer Application Programming Interface) to sposób komunikacji między systemami, który opiera się na standardowych metodach HTTP (GET, POST, PUT, DELETE). Dzięki REST API aplikacje mogą wymieniać dane w formacie JSON, co pozwala na integrację między stroną WWW, aplikacjami mobilnymi, grami czy systemami zewnętrznymi.
W platformie Bitfun REST API służy m.in. do komunikacji między grami (Unity) a serwerem — np. do wysyłania rekordów gracza.
2) Czym jest REST API?
REST API to zestaw punktów końcowych (endpointów), które umożliwiają pobieranie lub wysyłanie danych przy użyciu HTTP. Każdy endpoint realizuje jedną konkretną operację, np.:
pobranie danych (GET)
zapis danych (POST)
aktualizację danych (PUT)
usunięcie danych (DELETE)
Zalety REST API:
lekki i szybki
uniwersalny — działa na dowolnej platformie
korzysta ze standardów HTTP
używa JSON, który łatwo parsować
3) Przykład
PHP API:

Zapytanie JS:

4) REST API w Bitfun
Platforma Bitfun wykorzystuje REST API do bezpiecznego przyjmowania danych z gier. W tym przypadku — do zapisywania wyniku gracza. Endpoint wymaga:
aktywnej sesji (
$_SESSION['user_id'])parametrów
game_idiscoredodatkowego "hasła czasowego" (
pass)bezpiecznego zapisu w bazie (prepared statements)
odpowiedzi JSON
5) Przykład endpointu Bitfun
Co robi ten endpoint?
Wymaga, aby użytkownik był zalogowany w systemie Web (sesja PHP).
Sprawdza parametry
game_id,score(GET) orazpass(POST).Weryfikuje tajny token czasowy (
pass= minuta + stały klucz).Wstawia lub aktualizuje rekord w bazie:
jeśli rekord nie istnieje → tworzy
jeśli istnieje, ale wynik jest gorszy → aktualizuje
jeśli istnieje i wynik jest lepszy → ignoruje
Zwraca czytelną odpowiedź JSON.

Tu serwer:
oczekuje poprawnego tokenu
broni się przed dostępem bez sesji
zwraca odpowiednie kody HTTP (400, 401, 500)

Dzięki ON DUPLICATE KEY UPDATE:
jeśli gracz gra pierwszy raz → wynik jest dodany
jeśli gracz ulepsza rekord → wynik jest aktualizowany
jeśli gracz osiągnie gorszy → nic się nie zmienia
To najwydajniejszy sposób na obsługę rekordów.
6) Przykład klienta REST API (Unity)
Unity wysyła dane do API przy użyciu UnityWebRequest.Post.

Co robi ten kod?
tworzy URL z parametrami GET
dodaje parametry POST (
pass)wysyła żądanie do API
odbiera tekst JSON
wyświetla go w konsoli Unity
7) Podsumowanie
REST API w Bitfun:
umożliwia komunikację zewnętrznym aplikacjom (np. Unity, Python, JS)
działa w oparciu o JSON i standardowe kody HTTP
wykorzystuje sesje oraz dodatkowe zabezpieczenia (
pass)obsługuje błędy i zwraca czytelne komunikaty
bezpiecznie zapisuje dane do bazy (prepared statements)
Dzięki temu gry i aplikacje mogą w czasie rzeczywistym komunikować się z serwerem Bitfun, zapisując postępy użytkowników i ich wyniki.
set_score.php
<?php
header('Content-Type: application/json');
session_start();
if (!isset($_SESSION['user_id'])) {
http_response_code(401);
echo json_encode(["status" => "error", "message" => "Brak user_id w sesji. Zaloguj się ponownie."]);
exit();
}
if (!isset($_GET['game_id']) || !isset($_GET['score']) || !isset($_POST['pass'])) {
http_response_code(400);
echo json_encode(["status" => "error", "message" => "Brak wymaganych parametrow: game_id lub score."]);
exit();
}
$user_id = $_SESSION['user_id'];
$game_id = (int)$_GET['game_id'];
$score = (int)$_GET['score'];
$pass = $_POST['pass'];
if($pass != date("-")."E-----K")
exit;
require_once("../../scripts/db.php");
if ($db->connect_error) {
http_response_code(500);
echo json_encode(["status" => "error", "message" => "Blad polaczenia z baza danych: " . $db->connect_error]);
exit();
}
$db->set_charset("utf8mb4");
$sql = "
INSERT INTO records (game_id, user_id, score)
VALUES (?, ?, ?)
ON DUPLICATE KEY UPDATE
score = CASE
WHEN score < VALUES(score) THEN VALUES(score)
ELSE score
END
";
$stmt = $db->prepare($sql);
if (!$stmt) {
http_response_code(500);
echo json_encode(["status" => "error", "message" => "Blad przygotowania zapytania: " . $db->error]);
$db->close();
exit();
}
$stmt->bind_param("iii", $game_id, $user_id, $score);
if ($stmt->execute()) {
$rows_affected = $stmt->affected_rows;
$message = "Rekord zaktualizowany pomyslnie. ";
if ($rows_affected == 1) {
$message .= "Utworzono nowy rekord.";
} elseif ($rows_affected == 2) {
$message .= "Zaktualizowano istniejący rekord.";
} elseif ($rows_affected == 0) {
$message .= "Rekord istnial, ale wynik nie zostal zaktualizowany.";
}
echo json_encode(["status" => "success", "message" => $message, "game_id" => $game_id, "user_id" => $user_id, "new_score" => $score]);
} else {
http_response_code(500);
echo json_encode(["status" => "error", "message" => "Błąd wykonania zapytania: " . $stmt->error]);
}
$stmt->close();
$db->close();
?>