PHP / REST API үүсгэх
REST API үүсгэх
Орчин үеийн вэб болон мобайл апп-ууд back-end-тэй REST API-аар харилцдаг. REST (Representational State Transfer) нь URL-д нөөц (resource) тодорхойлж, HTTP аргуудаар (GET, POST, PUT, DELETE) үйлдэл хийдэг архитектурын зарчим юм. Энэ хичээлд цэвэр PHP-д suурилсан бүрэн бэлэн REST API бүтээнэ — фреймворк хэрэггүй, ойлголтууд нь Laravel болон бусад фреймворкт ч адилхан хэрэглэгддэг.
REST-ийн үндсэн зарчмууд
код
GET /api/хэрэглэгчид → Бүх хэрэглэгч авах
GET /api/хэрэглэгчид/1 → 1-р хэрэглэгч авах
POST /api/хэрэглэгчид → Шинэ хэрэглэгч үүсгэх
PUT /api/хэрэглэгчид/1 → 1-р хэрэглэгчийг бүрэн шинэчлэх
PATCH /api/хэрэглэгчид/1 → 1-р хэрэглэгчийг хэсэгчлэн шинэчлэх
DELETE /api/хэрэглэгчид/1 → 1-р хэрэглэгч устгах
URL нь нөөцийг (юу), HTTP арга нь үйлдлийг (юу хийх) тодорхойлдог.
.htaccess — URL чиглүүлэлт
Apache сервер дээр бүх хүсэлтийг нэг index.php файл руу чиглүүлнэ:
apache
# .htaccess
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [QSA,L]
php
<?php
// index.php — бүх хүсэлтийг хүлээж авна
header('Content-Type: application/json; charset=utf-8');
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET, POST, PUT, PATCH, DELETE, OPTIONS');
header('Access-Control-Allow-Headers: Content-Type, Authorization');
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
http_response_code(204);
exit;
}
// URL болон аргыг задлана
$арга = $_SERVER['REQUEST_METHOD'];
$зам = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
$хэсгүүд = array_filter(explode('/', trim($зам, '/')));
$хэсгүүд = array_values($хэсгүүд);
// /api/хэрэглэгчид эсвэл /api/хэрэглэгчид/1
$нөөц = $хэсгүүд[1] ?? null;
$id = isset($хэсгүүд[2]) ? (int)$хэсгүүд[2] : null;
// Чиглүүлэгч
match(true) {
$нөөц === 'хэрэглэгчид' => хэрэглэгч_чиглүүлэгч($арга, $id),
$нөөц === 'бүтээгдэхүүнүүд' => бүтээгдэхүүн_чиглүүлэгч($арга, $id),
default => api_алдаа("Endpoint олдсонгүй.", 404),
};
?>
Туслах функцууд ба хэрэглэгчийн controller
php
<?php
// Туслах функцууд
function api_хариу(mixed $өгөгдөл, int $статус = 200): never {
http_response_code($статус);
echo json_encode($өгөгдөл, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
exit;
}
function api_алдаа(string $мэдэгдэл, int $статус = 400): never {
api_хариу(['алдаа' => true, 'мэдэгдэл' => $мэдэгдэл], $статус);
}
function биеийн_өгөгдөл_авах(): array {
$json = file_get_contents('php://input');
$өгөгдөл = json_decode($json, true);
if (json_last_error() !== JSON_ERROR_NONE) {
api_алдаа("Хүчингүй JSON өгөгдөл.");
}
return $өгөгдөл ?? [];
}
// Жишээ өгөгдлийн сан (бодит програмд PDO ашиглана)
$хэрэглэгчид_дб = [
1 => ['id' => 1, 'нэр' => 'Болд', 'имэйл' => 'bold@example.mn', 'нас' => 25],
2 => ['id' => 2, 'нэр' => 'Сарнай', 'имэйл' => 'sarnai@example.mn', 'нас' => 22],
];
function хэрэглэгч_чиглүүлэгч(string $арга, ?int $id): never {
global $хэрэглэгчид_дб;
match($арга) {
'GET' => $id ? хэрэглэгч_нэгийг_авах($id) : хэрэглэгч_бүгдийг_авах(),
'POST' => хэрэглэгч_үүсгэх(),
'PUT' => $id ? хэрэглэгч_шинэчлэх($id) : api_алдаа("id шаардлагатай.", 400),
'DELETE' => $id ? хэрэглэгч_устгах($id) : api_алдаа("id шаардлагатай.", 400),
default => api_алдаа("Арга зөвшөөрөгдөөгүй.", 405),
};
}
?>
CRUD endpoint-уудын бүрэн хэрэгжүүлэлт
php
<?php
function хэрэглэгч_бүгдийг_авах(): never {
global $хэрэглэгчид_дб;
$жагсаалт = array_values($хэрэглэгчид_дб);
api_хариу([
'амжилт' => true,
'нийт' => count($жагсаалт),
'өгөгдөл' => $жагсаалт,
]);
}
function хэрэглэгч_нэгийг_авах(int $id): never {
global $хэрэглэгчид_дб;
if (!isset($хэрэглэгчид_дб[$id])) {
api_алдаа("Хэрэглэгч (id: {$id}) олдсонгүй.", 404);
}
api_хариу(['амжилт' => true, 'өгөгдөл' => $хэрэглэгчид_дб[$id]]);
}
function хэрэглэгч_үүсгэх(): never {
global $хэрэглэгчид_дб;
$өгөгдөл = биеийн_өгөгдөл_авах();
// Баталгаажуулалт
$алдаанууд = [];
if (empty($өгөгдөл['нэр'])) $алдаанууд[] = "Нэр шаардлагатай.";
if (empty($өгөгдөл['имэйл'])) $алдаанууд[] = "И-мэйл шаардлагатай.";
if (!empty($өгөгдөл['имэйл']) && !filter_var($өгөгдөл['имэйл'], FILTER_VALIDATE_EMAIL)) {
$алдаанууд[] = "И-мэйл формат буруу.";
}
if (!empty($алдаанууд)) {
api_хариу(['алдаа' => true, 'алдаанууд' => $алдаанууд], 422);
}
// Шинэ ID үүсгэнэ
$шинэ_id = max(array_keys($хэрэглэгчид_дб)) + 1;
$шинэ_хэрэглэгч = [
'id' => $шинэ_id,
'нэр' => trim($өгөгдөл['нэр']),
'имэйл' => trim($өгөгдөл['имэйл']),
'нас' => isset($өгөгдөл['нас']) ? (int)$өгөгдөл['нас'] : null,
];
$хэрэглэгчид_дб[$шинэ_id] = $шинэ_хэрэглэгч;
api_хариу(['амжилт' => true, 'өгөгдөл' => $шинэ_хэрэглэгч], 201);
}
function хэрэглэгч_шинэчлэх(int $id): never {
global $хэрэглэгчид_дб;
if (!isset($хэрэглэгчид_дб[$id])) {
api_алдаа("Хэрэглэгч (id: {$id}) олдсонгүй.", 404);
}
$өгөгдөл = биеийн_өгөгдөл_авах();
$хэрэглэгчид_дб[$id] = array_merge($хэрэглэгчид_дб[$id], $өгөгдөл);
$хэрэглэгчид_дб[$id]['id'] = $id; // id-г хэвээр хадгална
api_хариу(['амжилт' => true, 'өгөгдөл' => $хэрэглэгчид_дб[$id]]);
}
function хэрэглэгч_устгах(int $id): never {
global $хэрэглэгчид_дб;
if (!isset($хэрэглэгчид_дб[$id])) {
api_алдаа("Хэрэглэгч (id: {$id}) олдсонгүй.", 404);
}
unset($хэрэглэгчид_дб[$id]);
api_хариу(['амжилт' => true, 'мэдэгдэл' => "Хэрэглэгч устгагдлаа."], 200);
}
?>
API-г туршиж үзэх
curl командаар API-г терминалаас туршиж болно:
bash
# GET — бүх хэрэглэгч авах
curl http://localhost/api/хэрэглэгчид
# GET — нэг хэрэглэгч авах
curl http://localhost/api/хэрэглэгчид/1
# POST — шинэ хэрэглэгч үүсгэх
curl -X POST http://localhost/api/хэрэглэгчид \
-H "Content-Type: application/json" \
-d '{"нэр":"Тамир","имэйл":"tamir@example.mn","нас":30}'
# PUT — шинэчлэх
curl -X PUT http://localhost/api/хэрэглэгчид/1 \
-H "Content-Type: application/json" \
-d '{"нас":26}'
# DELETE — устгах
curl -X DELETE http://localhost/api/хэрэглэгчид/1
Дараагийн хичээлд:
Composer package manager-ийг судална. PHP-н гуравдагч номын сангуудыг хэрхэн суулгаж, autoload-г хэрхэн тохируулдаг, composer.json файлыг хэрхэн бичдгийг жишээгээр үзнэ.