🌐 PHP API piemēri
Šeit aplūkojam, kā PHP var nosūtīt pieprasījumus uz API un kā pats izveidot vienkāršu API galapunktu. Galveno REST API teoriju un pamatus atradīsi atsevišķā sadaļā API & REST.
Kas ir REST API?
REST API (Representational State Transfer) ir veids kā savienoties ar attāliem servisiem caur HTTP. Populārākie datu formāti ir JSON un XML.
| HTTP metode | Darbība | Piemērs |
|---|---|---|
| GET | Iegūt datus | GET /api/users |
| POST | Izveidot jaunu | POST /api/users |
| PUT | Atjaunināt visu | PUT /api/users/1 |
| PATCH | Daļēji atjaunināt | PATCH /api/users/1 |
| DELETE | Dzēst | DELETE /api/users/1 |
REST API praktisks pārskats
REST API parasti strādā pēc vienkārša principa: klients sūta HTTP pieprasījumu, serveris atgriež JSON datu objektu. Visbiežāk izmantotās metodes ir GET (iegūt), POST (izveidot), PUT (atjaunināt), PATCH (daļēji atjaunināt) un DELETE (dzēst).
🔄 Kā tas darbojas praksē?
- Klients — tīmekļa lapa, mobilā aplikācija vai cita servera programma
- Serveris — PHP, Node.js, Python vai cits backend
- Datu formāts — JSON, jo tas ir viegli lasāms gan cilvēkiem, gan programmām
- Atbilde — HTTP status kods + datu objekts
Šis piemērs parāda, kā no citas sistēmas iegūt JSON datus un tos apstrādāt. Turpmāk šādus datus var ievietot sarakstā, tabulā vai izmantot rezultātu renderēšanai lapā.
Šis fails darbojas kā vienkāršs API galapunkts. Uz GET /api.php atgriežas visi lietotāji, bet uz POST /api.php var pievienot jaunu ierakstu.
<?php
// 1) Iegūstam datus no publiska REST API
$url = "https://jsonplaceholder.typicode.com/users";
$data = @file_get_contents($url);
if ($data === false) {
die("Neizdevās iegūt datus no API.");
}
$lietotaji = json_decode($data, true);
foreach (array_slice($lietotaji, 0, 3) as $lietotajs) {
echo $lietotajs["id"] . ". " . $lietotajs["name"] . "<br>";
echo "E-pasts: " . $lietotajs["email"] . "<br><br>";
}
?>
<?php
header("Content-Type: application/json; charset=UTF-8");
header("Access-Control-Allow-Origin: *");
$method = $_SERVER["REQUEST_METHOD"];
$lietotaji = [
["id" => 1, "vards" => "Anna", "epasts" => "anna@example.com"],
["id" => 2, "vards" => "Jānis", "epasts" => "janis@example.com"],
];
if ($method === "GET") {
echo json_encode($lietotaji);
exit;
}
if ($method === "POST") {
$dati = json_decode(file_get_contents("php://input"), true);
if (empty($dati["vards"])) {
http_response_code(400);
echo json_encode(["kļūda" => "Vards ir obligāts"]);
exit;
}
$jauns = [
"id" => rand(100, 999),
"vards" => $dati["vards"],
"epasts" => $dati["epasts"] ?? ""
];
$lietotaji[] = $jauns;
http_response_code(201);
echo json_encode(["ziņojums" => "Lietotājs izveidots", "dati" => $jauns]);
exit;
}
http_response_code(405);
echo json_encode(["kļūda" => "Neatļauta metode"]);
?>
fetch("http://localhost/api.php")
.then(response => response.json())
.then(data => {
console.log(data);
})
.catch(error => {
console.error("Kļūda:", error);
});
fetch("http://localhost/api.php", {
method: "POST",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify({
vards: "Līga",
epasts: "liga@example.com"
})
})
.then(response => response.json())
.then(data => console.log(data));
API autentifikācija un CRUD darbības
Reālās aplikācijās API parasti ir aizsargāti. Dati nav pieejami ikvienam — klients vispirms nosūta Authorization galveni, un serveris pārbauda, vai tokens ir derīgs. Pēc tam tiek veikti CRUD darījumi: create, read, update, delete (izveidot, lasīt, atjaunināt, dzēst).
Šis piemērs parāda, kā API var būt aizsargāts ar tokenu un vienlaikus nodrošināt CRUD operācijas. Praktiskajā projektā šīs datu izmaiņas parasti glabā datubāzē, nevis masīvā.
<?php
header("Content-Type: application/json; charset=UTF-8");
$valid_token = "demo-token-123";
$auth_header = $_SERVER["HTTP_AUTHORIZATION"] ?? "";
if (!preg_match("/^Bearer\s+(.+)$/", $auth_header, $m)) {
http_response_code(401);
echo json_encode(["error" => "Nepieciešams Bearer tokens"]);
exit;
}
if ($m[1] !== $valid_token) {
http_response_code(403);
echo json_encode(["error" => "Nederīgs tokens"]);
exit;
}
$produkti = [
["id" => 1, "nosaukums" => "Klēps", "cena" => 59.99],
["id" => 2, "nosaukums" => "Pildspalva", "cena" => 2.50],
["id" => 3, "nosaukums" => "Pulkstenis", "cena" => 120.00],
];
$metode = $_SERVER["REQUEST_METHOD"];
$id = $_GET["id"] ?? null;
switch ($metode) {
case "GET":
if ($id !== null) {
$produkts = null;
foreach ($produkti as $p) {
if ((int)$p["id"] === (int)$id) {
$produkts = $p;
break;
}
}
if ($produkts === null) {
http_response_code(404);
echo json_encode(["error" => "Produkts nav atrasts"]);
} else {
echo json_encode($produkts);
}
} else {
echo json_encode($produkti);
}
break;
case "POST":
$dati = json_decode(file_get_contents("php://input"), true);
if (empty($dati["nosaukums"])) {
http_response_code(400);
echo json_encode(["error" => "Nosaukums ir obligāts"]);
exit;
}
$jauns = [
"id" => rand(100, 999),
"nosaukums" => $dati["nosaukums"],
"cena" => $dati["cena"] ?? 0
];
$produkti[] = $jauns;
http_response_code(201);
echo json_encode(["message" => "Produkts pievienots", "data" => $jauns]);
break;
case "PUT":
$dati = json_decode(file_get_contents("php://input"), true);
foreach ($produkti as &$p) {
if ((int)$p["id"] === (int)$id) {
$p["nosaukums"] = $dati["nosaukums"] ?? $p["nosaukums"];
$p["cena"] = $dati["cena"] ?? $p["cena"];
echo json_encode(["message" => "Produkts atjaunināts", "data" => $p]);
exit;
}
}
http_response_code(404);
echo json_encode(["error" => "Produkts nav atrasts"]);
break;
case "DELETE":
foreach ($produkti as $key => $p) {
if ((int)$p["id"] === (int)$id) {
unset($produkti[$key]);
echo json_encode(["message" => "Produkts dzēsts"]);
exit;
}
}
http_response_code(404);
echo json_encode(["error" => "Produkts nav atrasts"]);
break;
default:
http_response_code(405);
echo json_encode(["error" => "Metode nav atļauta"]);
}
?>
const token = "demo-token-123";
fetch("http://localhost/api.php?id=2", {
headers: {
"Authorization": `Bearer ${token}`
}
})
.then(res => res.json())
.then(data => console.log(data));
fetch("http://localhost/api.php", {
method: "POST",
headers: {
"Content-Type": "application/json",
"Authorization": `Bearer ${token}`
},
body: JSON.stringify({
nosaukums: "Skārienjutīgs klēps",
cena: 75.00
})
})
.then(res => res.json())
.then(data => console.log(data));
file_get_contents() – vienkāršākā metode
file_get_contents() ir vienkārša, bet nevar iestatīt laika limitus, nevar sūtīt POST/PUT/DELETE, nevar apstrādāt kļūdas viegli. Lai to risinātu, izmantojiet cURL.
<?php
// Vienkārša GET pieprasījuma nosūtīšana
$url = "https://jsonplaceholder.typicode.com/users/1";
$atbilde = file_get_contents($url);
$lietotājs = json_decode($atbilde, true); // true = asociatīvs masīvs
echo "Vārds: " . $lietotājs["name"] . "<br>";
echo "E-pasts: " . $lietotājs["email"] . "<br>";
echo "Pilsēta: " . $lietotājs["address"]["city"] . "<br>";
// Iegūt vairākus ierakstus
$url = "https://jsonplaceholder.typicode.com/posts";
$atbilde = file_get_contents($url);
$ieraksti = json_decode($atbilde, true);
echo "Kopā ierakstu: " . count($ieraksti) . "<br>";
foreach (array_slice($ieraksti, 0, 3) as $ieraksts) {
echo "<strong>{$ieraksts["title"]}</strong><br>";
echo substr($ieraksts["body"], 0, 80) . "...<br><br>";
}
?>
cURL – pilnvērtīgi API pieprasījumi
<?php
// ========================================
// GET pieprasījums ar cURL
// ========================================
function apiGET(string $url, array $galvenes = []): array {
$ch = curl_init();
curl_setopt_array($ch, [
CURLOPT_URL => $url,
CURLOPT_RETURNTRANSFER => true, // Atgriezt kā virkni
CURLOPT_TIMEOUT => 30, // Laika limits
CURLOPT_HTTPHEADER => array_merge([
"Accept: application/json",
"Content-Type: application/json",
], $galvenes),
CURLOPT_FOLLOWLOCATION => true, // Sekot pāradresācijām
CURLOPT_SSL_VERIFYPEER => true, // SSL pārbaude (prод)
]);
$atbilde = curl_exec($ch);
$http_kods = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$kļūda = curl_error($ch);
curl_close($ch);
if ($kļūda) {
throw new RuntimeException("cURL kļūda: $kļūda");
}
return [
"kods" => $http_kods,
"atbilde" => json_decode($atbilde, true),
];
}
// ========================================
// POST pieprasījums (sūtīt datus)
// ========================================
function apiPOST(string $url, array $dati, array $galvenes = []): array {
$ch = curl_init();
curl_setopt_array($ch, [
CURLOPT_URL => $url,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => json_encode($dati),
CURLOPT_HTTPHEADER => array_merge([
"Accept: application/json",
"Content-Type: application/json",
], $galvenes),
CURLOPT_TIMEOUT => 30,
]);
$atbilde = curl_exec($ch);
$http_kods = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
return [
"kods" => $http_kods,
"atbilde" => json_decode($atbilde, true),
];
}
// ========================================
// IZMANTOŠANA
// ========================================
try {
// GET
$rezultāts = apiGET("https://jsonplaceholder.typicode.com/posts/1");
echo "HTTP kods: {$rezultāts["kods"]}<br>";
echo "Virsraksts: {$rezultāts["atbilde"]["title"]}<br>";
// POST
$jauns = apiPOST("https://jsonplaceholder.typicode.com/posts", [
"title" => "Mans jaunais ieraksts",
"body" => "Satura teksts šeit...",
"userId"=> 1
]);
echo "Izveidots ar ID: {$jauns["atbilde"]["id"]}<br>"; // 101
} catch (RuntimeException $e) {
echo "Kļūda: " . $e->getMessage();
}
?>
API autentifikācija
<?php
// ========================================
// Bearer Token (JWT/OAuth)
// ========================================
function apiArToken(string $url, string $token): array {
$ch = curl_init($url);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"Authorization: Bearer $token",
"Accept: application/json",
],
]);
$atbilde = curl_exec($ch);
curl_close($ch);
return json_decode($atbilde, true) ?? [];
}
// GitHub API piemērs ar tokenu
$token = "ghp_jūsu_github_tokens";
$lietotājs = apiArToken("https://api.github.com/user", $token);
echo "GitHub lietotājs: " . ($lietotājs["login"] ?? "Nav pieejams") . "<br>";
// ========================================
// API atslēga kā parametrs (piemērs: OpenWeather)
// ========================================
$api_key = "jūsu_openweather_api_key";
$pilsēta = "Riga";
$url = "https://api.openweathermap.org/data/2.5/weather"
. "?q=" . urlencode($pilsēta)
. "&appid=" . $api_key
. "&units=metric"
. "&lang=lv";
$atbilde = file_get_contents($url);
$laiks = json_decode($atbilde, true);
if ($laiks && $laiks["cod"] == 200) {
echo "Rīgā pašlaik: {$laiks["main"]["temp"]}°C, "
. $laiks["weather"][0]["description"] . "<br>";
}
// ========================================
// HTTP Basic auth
// ========================================
$ch = curl_init("https://api.example.lv/data");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_USERPWD => "lietotājvārds:parole",
]);
$atbilde = curl_exec($ch);
curl_close($ch);
?>
JSON apstrāde
<?php
// JSON dekodēšana
$json_teksts = '{"vārds":"Anna","vecums":28,"hobiji":["lasīšana","sports"]}';
$dati = json_decode($json_teksts); // stdClass objekts
$dati_masīvs = json_decode($json_teksts, true); // Asociatīvs masīvs
echo $dati->vārds . "<br>"; // Anna
echo $dati_masīvs["vecums"] . "<br>"; // 28
echo $dati_masīvs["hobiji"][0] . "<br>"; // lasīšana
// JSON kodēšana
$masīvs = [
"produkts" => "PHP rokasgrāmata",
"cena" => 14.99,
"pieejams" => true,
"tags" => ["php", "web", "programmēšana"]
];
$json = json_encode($masīvs, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
echo "<pre>$json</pre>";
// Kļūdu pārbaude
$slikts_json = "{vards: Anna}"; // Nav derīgs JSON
$rezultāts = json_decode($slikts_json, true);
if (json_last_error() !== JSON_ERROR_NONE) {
echo "JSON kļūda: " . json_last_error_msg() . "<br>";
}
// Sarežģītu JSON apstrāde - ligzdoti masīvi
$api_atbilde = '{"data":{"users":[{"id":1,"name":"Anna"},{"id":2,"name":"Jānis"}]},"meta":{"total":2}}';
$objekts = json_decode($api_atbilde, true);
echo "Kopā: " . $objekts["meta"]["total"] . "<br>";
foreach ($objekts["data"]["users"] as $u) {
echo "ID {$u["id"]}: {$u["name"]}<br>";
}
?>
Izveidot savu API ar PHP
Lai testētu API pieprasījumus, izmanto Postman vai browser paplašinājumu. Komandrinā: curl http://localhost/api.php
🎓 Apsveicam! PHP sadaļa pabeigta!
Jūs apguvāt PHP no pamatiem līdz API. Turpiniet ar JavaScript sadaļu →
<?php
// api.php - Vienkāršs REST API
header("Content-Type: application/json; charset=UTF-8");
header("Access-Control-Allow-Origin: *"); // CORS atļaut visiem
// Parsēt pieprasījumu
$metode = $_SERVER["REQUEST_METHOD"];
$uri = parse_url($_SERVER["REQUEST_URI"], PHP_URL_PATH);
$dati = json_decode(file_get_contents("php://input"), true);
// Produktu datu bāze (simulācija)
$produkti = [
1 => ["id" => 1, "nosaukums" => "Ābols", "cena" => 0.50],
2 => ["id" => 2, "nosaukums" => "Bumbieris", "cena" => 1.20],
3 => ["id" => 3, "nosaukums" => "Ķirsis", "cena" => 2.50],
];
// Iegūt ID no URL ( /api.php/1 )
$id = null;
if (preg_match("/\/api\.php\/(\d+)$/", $uri, $atb)) {
$id = (int) $atb[1];
}
// Maršrutēšana
match($metode) {
"GET" => (function() use ($produkti, $id) {
if ($id) {
$p = $produkti[$id] ?? null;
if (!$p) { http_response_code(404); echo json_encode(["kļūda" => "Nav atrasts"]); return; }
echo json_encode($p);
} else {
echo json_encode(array_values($produkti));
}
})(),
"POST" => (function() use ($dati) {
if (empty($dati["nosaukums"])) {
http_response_code(400);
echo json_encode(["kļūda" => "Nosaukums obligāts"]);
return;
}
http_response_code(201);
echo json_encode(["veiksmīgi" => true, "id" => rand(100, 999)]);
})(),
default => (function() {
http_response_code(405);
echo json_encode(["kļūda" => "Metode nav atļauta"]);
})(),
};
?>