API-dokumentaatio

Avoin JSON-rajapinta VRL Tulosarkiston dataan. Ei API-avainta, ei rekisteröitymistä.

Perusosoite (base URL):

https://vrl-results-b3eve6e9c3ftaub8.westeurope-01.azurewebsites.net/api
Perusosoite on pitkä Azure-oletusdomain. Jos se joskus vaihtuu, tähän sivuun päivitetään uusi osoite — kannattaa siis linkittää tähän dokumentaatioon, ei kovakoodata domainia moneen paikkaan.

Endpointit

GET /hevonen/{VH-tunnus}

Palauttaa listan kaikista kilpailuista, joissa kyseinen hevonen on ollut mukana, vanhimmasta uusimpaan. Tyhjä lista [] jos tunnusta ei löydy.

Esimerkki: /hevonen/VH24-012-0038

[
  {
    "result_id": "211584",
    "competition_date": "30.04.2024",
    "division": "Kenttäratsastusjaos (KERJ)",
    "organizing_stable": "Bråvalla Stall (BRA1399)",
    "invitation_url": "https://kanelipulla.net/bravalla/kisat/kerjcup0424.php",
    "class": "CIC3 (avoin vain hevosille, ei suomenhevosille)",
    "placement": 46,
    "participant_count": 49,
    "rider_vrl": "VRL-10735"
  }
]

GET /kilpailu/{result_id}

Yhden kilpailun perustiedot ja kaikki tulosrivit. Palauttaa 404 ja {"error": "not_found"} jos id:tä ei ole.

Esimerkki: /kilpailu/252344

{
  "competition": {
    "result_id": "252344",
    "competition_id": "#255001",
    "competition_date": "31.08.2026",
    "division": "Kenttäratsastusjaos (KERJ)",
    "organizing_stable": "Harmony Sporthorses (HARS3691)",
    "draw_method": "Lyhyt/pitkä arvonta",
    "invitation_url": "https://kwpnyhdistys.altervista.org/cup/elo26.html"
  },
  "results": [
    {
      "class": "CIC1 (avoin vain poneille ja hevosille)",
      "participant_count": 9,
      "placed_count": 3,
      "placement": 1,
      "rider_vrl": "VRL-10735",
      "horse_vh": "VH24-012-0038"
    }
  ]
}

GET /viimeisimmat?raja={n}

Viimeksi tallennetut kilpailut, uusin ensin. Valinnainen raja (oletus 15).

Esimerkki: /viimeisimmat?raja=10

[
  {
    "result_id": "252344",
    "competition_id": "#255001",
    "competition_date": "31.08.2026",
    "division": "Kenttäratsastusjaos (KERJ)",
    "organizing_stable": "Harmony Sporthorses (HARS3691)",
    "draw_method": "Lyhyt/pitkä arvonta",
    "invitation_url": "https://kwpnyhdistys.altervista.org/cup/elo26.html"
  }
]

Esimerkki: hevosen tulokset omalle sivulle

Alla olevat esimerkit hakevat hevosen kilpailut VH-tunnuksella ja tulostavat ne taulukkona. Vaihda VH24-012-0038 oman hevosesi tunnukseen.

Vaihtoehto A — HTML + JavaScript (selainpuoli)

Toimii millä tahansa sivulla, myös staattisella. Ei tarvita palvelinta. Liitä tämä kohtaan, jossa haluat taulukon näkyvän:

<div id="vrl-tulokset">Ladataan kilpailutuloksia…</div>

<script>
(function () {
  var VH  = "VH24-012-0038"; // <-- hevosen VH-tunnus
  var API = "https://vrl-results-b3eve6e9c3ftaub8.westeurope-01.azurewebsites.net/api";
  var box = document.getElementById("vrl-tulokset");

  fetch(API + "/hevonen/" + encodeURIComponent(VH))
    .then(function (r) {
      if (!r.ok) throw new Error("HTTP " + r.status);
      return r.json();
    })
    .then(function (kisat) {
      if (!kisat.length) { box.textContent = "Ei kilpailutuloksia."; return; }

      var html = "<table><thead><tr>"
        + "<th>Pvm</th><th>Jaos</th><th>Luokka</th>"
        + "<th>Sij.</th><th>Osall.</th><th>Ratsastaja</th>"
        + "<th>Järjestäjä</th></tr></thead><tbody>";

      kisat.forEach(function (k) {
        html += "<tr>"
          + "<td>" + esc(k.competition_date)   + "</td>"
          + "<td>" + esc(k.division)           + "</td>"
          + "<td>" + esc(k.class)              + "</td>"
          + "<td>" + k.placement               + "</td>"
          + "<td>" + k.participant_count       + "</td>"
          + "<td>" + esc(k.rider_vrl)          + "</td>"
          + "<td>" + esc(k.organizing_stable)  + "</td>"
          + "</tr>";
      });

      box.innerHTML = html + "</tbody></table>";
    })
    .catch(function (e) {
      box.textContent = "Tulosten haku epäonnistui: " + e.message;
    });

  // Estää HTML-injektion tallinimissä yms.
  function esc(s) {
    return String(s == null ? "" : s).replace(/[&<>"]/g, function (c) {
      return { "&": "&amp;", "<": "&lt;", ">": "&gt;", '"': "&quot;" }[c];
    });
  }
})();
</script>

Vaihtoehto B — PHP (palvelinpuoli)

Kun sivusi pyörii PHP:llä. Yksinkertaisin tapa, jos palvelimella on allow_url_fopen päällä (yleensä on):

<?php
$vh  = 'VH24-012-0038'; // hevosen VH-tunnus
$api = 'https://vrl-results-b3eve6e9c3ftaub8.westeurope-01.azurewebsites.net/api';

$json  = @file_get_contents($api . '/hevonen/' . rawurlencode($vh));
$kisat = $json !== false ? json_decode($json, true) : null;

if (!$kisat) {
    echo '<p>Ei kilpailutuloksia.</p>';
    return;
}
?>
<table>
  <thead>
    <tr>
      <th>Pvm</th><th>Jaos</th><th>Luokka</th><th>Sij.</th>
      <th>Osall.</th><th>Ratsastaja</th><th>Järjestäjä</th>
    </tr>
  </thead>
  <tbody>
  <?php foreach ($kisat as $k): ?>
    <tr>
      <td><?= htmlspecialchars($k['competition_date']) ?></td>
      <td><?= htmlspecialchars($k['division']) ?></td>
      <td><?= htmlspecialchars($k['class']) ?></td>
      <td><?= (int) $k['placement'] ?></td>
      <td><?= (int) $k['participant_count'] ?></td>
      <td><?= htmlspecialchars($k['rider_vrl']) ?></td>
      <td><?= htmlspecialchars($k['organizing_stable']) ?></td>
    </tr>
  <?php endforeach; ?>
  </tbody>
</table>

Jos allow_url_fopen on pois päältä, käytä cURL:ia:

<?php
function vrl_hae(string $url): ?array {
    $ch = curl_init($url);
    curl_setopt_array($ch, [
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_TIMEOUT        => 15,
        CURLOPT_USERAGENT      => 'oma-talli-sivu/1.0',
    ]);
    $body = curl_exec($ch);
    $code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);

    return ($body !== false && $code === 200) ? json_decode($body, true) : null;
}

$api   = 'https://vrl-results-b3eve6e9c3ftaub8.westeurope-01.azurewebsites.net/api';
$kisat = vrl_hae($api . '/hevonen/' . rawurlencode('VH24-012-0038'));
Välimuisti: älä hae rajapintaa joka sivulatauksella. Data päivittyy vain kerran vuorokaudessa, joten tallenna vastaus esim. tiedostoon tunniksi. Yksinkertainen PHP-välimuisti:
<?php
$cache = sys_get_temp_dir() . '/vrl_' . $vh . '.json';

if (!is_file($cache) || time() - filemtime($cache) > 3600) {
    $fresh = @file_get_contents($api . '/hevonen/' . rawurlencode($vh));
    if ($fresh !== false) {
        file_put_contents($cache, $fresh);
    }
}
$kisat = json_decode(@file_get_contents($cache) ?: 'null', true);

Linkitä kilpailu takaisin arkistoon

Jokaisella rivillä on result_id. Sillä saat linkin kilpailun koko tulosnäkymään:

https://vrl-tulosarkisto.pages.dev/?tulos_id=252344

Huomioita