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_id i score

  • dodatkowego "hasła czasowego" (pass)

  • bezpiecznego zapisu w bazie (prepared statements)

  • odpowiedzi JSON

5) Przykład endpointu Bitfun

Co robi ten endpoint?

  1. Wymaga, aby użytkownik był zalogowany w systemie Web (sesja PHP).

  2. Sprawdza parametry game_id, score (GET) oraz pass (POST).

  3. Weryfikuje tajny token czasowy (pass = minuta + stały klucz).

  4. 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

  5. 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();

?>