Sobes.tech
Junior

Mi az a RESTful és hogyan használják webszolgáltatások fejlesztésében?

sobes.tech MI

Válasz az MI-től

RESTful egy architektúrális stílus a elosztott rendszerek fejlesztéséhez, mint például a webszolgáltatások. A REST (Representational State Transfer) elvein alapul.

A REST fő elvei:

  • Kliens-szerver: Világos elválasztás a kliens és a szerver között.
  • Stateless (Állapot nélküli): A szerver nem tárol információt az ügyfél állapotáról a kérések között. Minden kérés tartalmazza a szükséges adatokat.
  • Cacheable (Gyorsítótárazható): A kliensek vagy közbenső csomópontok cache-elhetik a válaszokat.
  • Layered System (Réteges rendszer): A rendszer rétegekre osztható, és minden réteg csak a közvetlen szomszédjára lát rá.
  • Code-On-Demand (Kód kérésre - opcionális): A szerver ideiglenesen bővítheti vagy konfigurálhatja a kliens funkcionalitását kód átadásával.
  • Uniform Interface (Egységes felület): Ez magában foglalja:
    • Resources Identification (Erőforrások azonosítása): Az erőforrásokat URI-k segítségével azonosítjuk.
    • Manipulation of Resources through Representations (Erőforrások manipulálása reprezentációkon keresztül): A kliens az erőforrással a reprezentációja (pl. JSON, XML) segítségével lép kapcsolatba.
    • Self-descriptive Messages (Önmagát leíró üzenetek): Minden üzenet tartalmazza a feldolgozáshoz szükséges információkat.
    • Hypermedia as the Engine of Application State (HATEOAS - Hipermédia mint az alkalmazás állapotának motorja): A szerver válaszai tartalmaznak linkeket más erőforrásokra, lehetővé téve a kliens számára a dinamikus felfedezést és navigációt.

A C# nyelvben a RESTful architektúra gyakran az ASP.NET Core Web API technológiával valósul meg.

Egy tipikus RESTful használat példája C#-ban:

// Kontroller az "Product" erőforrás kezeléséhez
[ApiController]
[Route("api/[controller]")]
public class ProductsController : ControllerBase
{
    private readonly IProductRepository _productRepository;

    public ProductsController(IProductRepository productRepository)
    {
        _productRepository = productRepository;
    }

    // Minden termék lekérése (GET /api/products)
    [HttpGet]
    public async Task<ActionResult<IEnumerable<Product>>> GetProducts()
    {
        var products = await _productRepository.GetAllAsync();
        return Ok(products);
    }

    // Termék lekérése ID szerint (GET /api/products/{id})
    [HttpGet("{id}")]
    public async Task<ActionResult<Product>> GetProduct(int id)
    {
        var product = await _productRepository.GetByIdAsync(id);
        if (product == null)
        {
            return NotFound();
        }
        return Ok(product);
    }

    // Új termék létrehozása (POST /api/products)
    [HttpPost]
    public async Task<ActionResult<Product>> CreateProduct(Product product)
    {
        await _productRepository.AddAsync(product);
        return CreatedAtAction(nameof(GetProduct), new { id = product.Id }, product);
    }

    // Létező termék frissítése (PUT /api/products/{id})
    [HttpPut("{id}")]
    public async Task<IActionResult> UpdateProduct(int id, Product product)
    {
        if (id != product.Id)
        {
            return BadRequest();
        }
        var existingProduct = await _productRepository.GetByIdAsync(id);
        if (existingProduct == null)
        {
            return NotFound();
        }
        await _productRepository.UpdateAsync(product);
        return NoContent();
    }

    // Termék törlése (DELETE /api/products/{id})
    [HttpDelete("{id}")]
    public async Task<IActionResult> DeleteProduct(int id)
    {
        var product = await _productRepository.GetByIdAsync(id);
        if (product == null)
        {
            return NotFound();
        }
        await _productRepository.DeleteAsync(id);
        return NoContent();
    }
}

public class Product
{
    public int Id { get; set; }
    public string Name { get; set; }
    public decimal Price { get; set; }
}

public interface IProductRepository
{
    Task<IEnumerable<Product>> GetAllAsync();
    Task<Product> GetByIdAsync(int id);
    Task AddAsync(Product product);
    Task UpdateAsync(Product product);
    Task DeleteAsync(int id);
}

A HTTP módszerek (GET, POST, PUT, DELETE) használata az erőforrások (URI-k által reprezentáltak) műveleteiben a RESTful API tervezés kulcsfontosságú része. A HTTP státuszkódok (200 OK, 201 Created, 204 No Content, 400 Bad Request, 404 Not Found) az eredményeket jelzik.