PHP
Proje sonu - REST API
Tüm parçaları birleştirip çalışan REST API'yi tamamlarsın.
Tüm parçaları birleştirmek
Son derste tüm parçaları birleştirirsin. Router, addRoute, dispatch ve JsonResponse hazır. Şimdi dört işleyici yazacaksın: handleGet görev listesini döndürür, handlePost yeni görev oluşturur, handlePut günceller, handleDelete siler.
Ardından runRestApi() fonksiyonu bir Router örneği oluşturur, dört rotayı kaydeder, $_SERVER değerlerini elden verir ve dispatch ile isteği yürütür. Dönen JsonResponse nesnesinin send() yöntemi yapısal veriyi yazar.
Hata yanıtları
API'ler hatayı da tutarlı biçimde bildirmeli. Bilinmeyen bir yol ya da yöntem 404 ile yanıtlanır; gövdede bir hata iletisi olur. Eksik veya bozuk gövde 400 ile yanıtlanır.
Her hata yanıtı da bir JsonResponse örneğidir; böylece başarılı ve hatalı yanıtlar aynı yapıyı paylaşır. İstemci tek bir ayrıştırıcıyla her durumu ele alır.
Uygulama runRestApi fonksiyonunu yaz
runRestApi() fonksiyonunu yaz. İçinde yeni bir Router oluştur ve dört rotayı addRoute ile ekle: GET /tasks, POST /tasks, PUT /tasks/1, DELETE /tasks/1 — işleyiciler sırayla "handleGet", "handlePost", "handlePut", "handleDelete". Sonra $_SERVER["REQUEST_METHOD"] = "GET"; ve $_SERVER["PATH_INFO"] = "/tasks"; ata, dispatch ile isteği yürüt ve dönen JsonResponse nesnesinin send() çıktısını döndür.
Örnek çözümü göster
string { ... } yaz. İçinde $router = new Router(); ile başla. Dört $router->addRoute(...) çağrısı yap. $_SERVER["REQUEST_METHOD"] = "GET"; ve $_SERVER["PATH_INFO"] = "/tasks"; ata. $response = $router->dispatch($_SERVER["REQUEST_METHOD"], $_SERVER["PATH_INFO"]); ile yürüt ve return $response->send(); döndür.
Örnek çözüm:
<?php
// REST API projesi: tüm parçalar birleşti — runRestApi demo'sunu yaz
class Router {
public array $routes = [];
public function addRoute(string $method, string $path, $handler): void {
$this->routes[] = ["method" => $method, "path" => $path, "handler" => $handler];
}
public function dispatch(string $method, string $path) {
foreach ($this->routes as $route) {
if ($route["method"] === $method && $route["path"] === $path) {
return ($route["handler"])();
}
}
return "404 Bulunamadı";
}
}
class JsonResponse {
public int $status;
public array $body;
public function __construct(int $status, array $body) {
$this->status = $status;
$this->body = $body;
}
public function send(): string {
http_response_code($this->status);
header("Content-Type: application/json");
return json_encode($this->body, JSON_UNESCAPED_UNICODE);
}
}
function handleGet(): JsonResponse {
return new JsonResponse(200, ["tasks" => [["id" => 1, "title" => "İlk görev"]]]);
}
function handlePost(): JsonResponse {
return new JsonResponse(201, ["message" => "Oluşturuldu"]);
}
function handlePut(): JsonResponse {
return new JsonResponse(200, ["message" => "Güncellendi"]);
}
function handleDelete(): JsonResponse {
return new JsonResponse(200, ["message" => "Silindi"]);
}
function runRestApi(): string {
$router = new Router();
$router->addRoute("GET", "/tasks", "handleGet");
$router->addRoute("POST", "/tasks", "handlePost");
$router->addRoute("PUT", "/tasks/1", "handlePut");
$router->addRoute("DELETE", "/tasks/1", "handleDelete");
$_SERVER["REQUEST_METHOD"] = "GET";
$_SERVER["PATH_INFO"] = "/tasks";
$response = $router->dispatch($_SERVER["REQUEST_METHOD"], $_SERVER["PATH_INFO"]);
return $response->send();
}
// Demo:
echo runRestApi();
Kendini test et
-
İstek yolunu tamamla
$_SERVER["____"]
Cevabı göster
$_SERVER["PATH_INFO"]
-
İşleyicileri eşleştir
- handleGet
- Listeler
- handlePost
- Oluşturur
- handlePut
- Günceller
- handleDelete
- Siler
-
handlePost işleyicisi yeni kaynak oluşturunca hangi durum kodunu döndürmeli?
- 201 Oluşturuldu
- 200 Tamam
- 404 Bulunamadı
- 400 Geçersiz istek
Cevabı göster
201 Oluşturuldu — Doğru. Yeni kaynak oluşturma 201 ile bildirilir; 200 mevcut kaynağın başarılı okumusudur.
Sıradaki ders: password_hash() ile hashleme