0Pricing
Learn Rust Coding · Ders

Uç Noktalar ve Modeller

Rotalar ve veriler

Uç Noktalar ve Modeller, CoddyKit'te ücretsiz bir Learn Rust Coding dersidir. Bu, 4 dersinin 2. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Learn Rust Coding öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Learn Rust Coding kursu toplamda 4 dersten oluşur.

Rotalar ve Veri Modelleri

Bir API, uç noktaları (URL'ler ve HTTP yöntemleri) ve bunlardan geçen modelleri (veri biçimlerini) tanımlar. Bu derste serde ile istek ve yanıt modelleri tanımlayacak, Axum'da CRUD tarzı rotaları birbirine bağlayacaksınız.

Model Tanımlama

Model, sıradan bir Rust yapısıdır. Yanıtlarda JSON'a dönüştürülebilmesi için Serialize, istek gövdelerinden ayrıştırılabilmesi için Deserialize türetin. Alan adları doğrudan JSON anahtarlarına eşlenir.

use serde::{Serialize, Deserialize};

#[derive(Serialize, Deserialize, Clone)]
struct Todo {
    id: u32,
    title: String,
    done: bool,
}

İstek ve Yanıt Türlerini Ayırma

İstemciler bir kaynak oluştururken sunucu tarafından atanan id değerini göndermemelidir. İstek gövdesi için ayrı bir girdi yapısı, yanıtlar içinse tam modeli kullanın. Bu, sözleşmeyi açık tutar ve istemcilerin değiştirmemeleri gereken alanları ayarlamasını önler.

use serde::Deserialize;

#[derive(Deserialize)]
struct CreateTodo {
    title: String,
}
// The handler assigns the id and sets done = false.

GET: Kaynakları Listeleme

Bir GET /todos işleyicisi, koleksiyonun tamamını JSON dizisi olarak döndürür. Paylaşılan durumu okur, verileri kilitten hızlıca kopyalayarak çıkarır ve Json içine sarar.

use axum::{extract::State, Json};
use std::sync::{Arc, Mutex};

type Store = Arc<Mutex<Vec<Todo>>>;
#[derive(Clone, serde::Serialize)]
struct Todo { id: u32, title: String, done: bool }

async fn list_todos(State(store): State<Store>) -> Json<Vec<Todo>> {
    let todos = store.lock().unwrap().clone();
    Json(todos)
}

POST: Kaynak Oluşturma

Bir POST /todos işleyicisi JSON gövdesini Json çıkarıcısıyla okur, yeni bir kimlik atar, öğeyi depolar ve 201 Created durumuyla döndürür. (StatusCode, Json<T>) demeti hem durumu hem de gövdeyi ayarlamanızı sağlar.

use axum::{extract::State, Json, http::StatusCode};

async fn create_todo(
    State(store): State<Store>,
    Json(input): Json<CreateTodo>,
) -> (StatusCode, Json<Todo>) {
    let mut todos = store.lock().unwrap();
    let id = todos.len() as u32 + 1;
    let todo = Todo { id, title: input.title, done: false };
    todos.push(todo.clone());
    (StatusCode::CREATED, Json(todo))
}

Yol Parametreleri

Tek bir kaynağı almak için URL'nin bir bölümünü yol parametresiyle yakalayın. Bunu rotada /todos/{id} olarak bildirin ve Path çıkarıcısıyla alın. İstediğiniz tür (u32) otomatik olarak ayrıştırılır.

use axum::extract::{Path, State};
use axum::{Json, http::StatusCode};

async fn get_todo(
    State(store): State<Store>,
    Path(id): Path<u32>,
) -> Result<Json<Todo>, StatusCode> {
    let todos = store.lock().unwrap();
    match todos.iter().find(|t| t.id == id) {
        Some(t) => Ok(Json(t.clone())),
        None => Err(StatusCode::NOT_FOUND),
    }
}

Sorgu Parametreleri

Filtreleme ve sayfalama, /todos?done=true gibi sorgu dizesini kullanır. Bunu Query çıkarıcısıyla bir Deserialize yapısına alın. Eksik parametrelerin sorun oluşturmaması için isteğe bağlı alanlarda Option kullanılır.

use axum::extract::{Query, State};
use axum::Json;
use serde::Deserialize;

#[derive(Deserialize)]
struct Filter { done: Option<bool> }

async fn filtered(
    State(store): State<Store>,
    Query(f): Query<Filter>,
) -> Json<Vec<Todo>> {
    let todos = store.lock().unwrap();
    let out = todos.iter()
        .filter(|t| f.done.map_or(true, |d| t.done == d))
        .cloned().collect();
    Json(out)
}

PUT ve DELETE

Güncelleme, gövdeyle birlikte PUT /todos/{id} kullanır; silme ise DELETE /todos/{id} kullanır. Her ikisi de öğeyi kimliğine göre arar ve öğe yoksa 404 döndürür. Silme işlemi başarılı olduğunda genellikle 204 No Content döndürür.

use axum::extract::{Path, State};
use axum::http::StatusCode;

async fn delete_todo(
    State(store): State<Store>,
    Path(id): Path<u32>,
) -> StatusCode {
    let mut todos = store.lock().unwrap();
    let before = todos.len();
    todos.retain(|t| t.id != id);
    if todos.len() < before { StatusCode::NO_CONTENT }
    else { StatusCode::NOT_FOUND }
}

Rotaları Birbirine Bağlama

Her işleyiciyi yönlendiriciye kaydedin. Paylaşılan yollardaki yöntemleri gruplayın: /todos listeleme ve oluşturma işlemlerini, /todos/{id} ise alma, güncelleme ve silme işlemlerini yönetir. Paylaşılan depoyu .with_state ile ekleyin.

use axum::{routing::get, Router};

fn build(store: Store) -> Router {
    Router::new()
        .route("/todos", get(list_todos).post(create_todo))
        .route("/todos/{id}",
            get(get_todo).delete(delete_todo))
        .with_state(store)
}

Girdiyi Doğrulama

İstemci verilerine asla güvenmeyin. Verileri işleyicinin içinde denetleyin ve geçersiz olduğunda 400 Bad Request döndürün. Burada, herhangi bir şeyi depolamadan önce boş bir başlığı reddederek hatalı verilerin sisteme girmesini önlüyoruz.

use axum::{Json, extract::State, http::StatusCode};

async fn create_validated(
    State(store): State<Store>,
    Json(input): Json<CreateTodo>,
) -> Result<(StatusCode, Json<Todo>), StatusCode> {
    if input.title.trim().is_empty() {
        return Err(StatusCode::BAD_REQUEST);
    }
    let mut todos = store.lock().unwrap();
    let id = todos.len() as u32 + 1;
    let todo = Todo { id, title: input.title, done: false };
    todos.push(todo.clone());
    Ok((StatusCode::CREATED, Json(todo)))
}

Tutarlı Hata Yanıtları

Yalnızca durum kodları döndürmek işe yarar; ancak üretim API'leri bunun yanında JSON hata gövdesi de döndürür. Yaygın bir yaklaşım, IntoResponse uygulayan özel bir hata numaralandırması kullanarak her çeşidi bir durum ve iletiyle eşlemektir. Bu, istemcilere öngörülebilir ve makine tarafından okunabilir hatalar sağlar.

use axum::response::{IntoResponse, Response};
use axum::http::StatusCode;
use axum::Json;
use serde_json::json;

enum ApiError { NotFound, BadRequest(String) }

impl IntoResponse for ApiError {
    fn into_response(self) -> Response {
        let (status, msg) = match self {
            ApiError::NotFound => (StatusCode::NOT_FOUND, "not found".to_string()),
            ApiError::BadRequest(m) => (StatusCode::BAD_REQUEST, m),
        };
        (status, Json(json!({ "error": msg }))).into_response()
    }
}

Hızlı Kontrol

Uç noktalar ve modeller hakkındaki anlayışınızı test edin.

Özet

Uç noktaları ve modelleri tanımladınız:

  • Modeller, Serialize/Deserialize türeten yapılardır; girdi türlerini ayrı kullanın.
  • Json, Path, Query ve State, istek verilerini çıkarır.
  • CRUD işlemlerini uygun durum kodlarıyla GET/POST/PUT/DELETE yöntemleriyle eşleyin.
  • Girdiyi doğrulayın ve hatalı verilerde 400 döndürün.
  • IntoResponse uygulayan özel bir hata türü, tutarlı JSON hataları sağlar.

Sıkça Sorulan Sorular

“Uç Noktalar ve Modeller” dersi ücretsiz mi?

Evet — “Uç Noktalar ve Modeller” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Learn Rust Coding kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Learn Rust Coding kursu toplamda 4 dersten oluşur.

“Uç Noktalar ve Modeller” dersinde ne öğreneceğim?

Rotalar ve veriler Learn Rust Coding ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

Learn Rust Coding öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te Learn Rust Coding, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 2. dersidir.

“Uç Noktalar ve Modeller” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu Learn Rust Coding dersinde kod yazıp çalıştırabilir miyim?

Evet. Her Learn Rust Coding dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. Proje Kurulumu
  2. Uç Noktalar ve Modeller
  3. Veritabanı Tümleştirmesi
  4. API'yi Test Etme
← Learn Rust Coding Sayfasına Dön