Junior
Čo je RESTful a ako sa používa pri vývoji webových služieb?
sobes.tech AI
Odpoveď od AI
RESTful je architektonický štýl pre vývoj distribuovaných systémov, ako sú webové služby. Je založený na princípoch REST (Representational State Transfer).
Hlavné princípy REST:
- Klient-server: Jasné rozdelenie medzi klientom a serverom.
- Stateless (Bez stavu): Server neukladá informácie o stave klienta medzi požiadavkami. Každá požiadavka obsahuje všetky potrebné údaje.
- Cacheable (Cacheovateľné): Klienti alebo medzičlánky môžu cache-ovať odpovede.
- Layered System (Vrstvený systém): Systém môže byť organizovaný do vrstiev, pričom každá vrstva vidí iba najbližšiu vrstvu.
- Code-On-Demand (Kód na požiadanie - voliteľné): Server môže dočasne rozširovať alebo konfigurovať funkcionalitu klienta prostredníctvom prenosu spustiteľného kódu.
- Uniform Interface (Jednotné rozhranie): Zahŕňa:
- Identification of Resources (Identifikácia zdrojov): Zdroje sú identifikované pomocou URI.
- Manipulation of Resources through Representations (Manipulácia so zdrojmi cez reprezentácie): Klient komunikuje so zdrojom cez jeho reprezentáciu (napríklad JSON, XML).
- Self-descriptive Messages (Samoodpovedajúce správy): Každá správa obsahuje dostatočné informácie na spracovanie.
- Hypermedia as the Engine of Application State (HATEOAS - Hypermedia ako motor stavu aplikácie): Odpovede servera obsahujú odkazy na iné zdroje, čo umožňuje klientovi dynamicky objavovať dostupné akcie a prechody.
V vývoji webových služieb na C# RESTful architektúra často sa implementuje pomocou technológie ASP.NET Core Web API.
Príklad typického použitia RESTful v C#:
// Kontrolér pre správu zdroja "Produkt"
[ApiController]
[Route("api/[controller]")]
public class ProductsController : ControllerBase
{
private readonly IProductRepository _productRepository;
public ProductsController(IProductRepository productRepository)
{
_productRepository = productRepository;
}
// Získanie všetkých produktov (GET /api/products)
[HttpGet]
public async Task<ActionResult<IEnumerable<Product>>> GetProducts()
{
var products = await _productRepository.GetAllAsync();
return Ok(products);
}
// Získanie produktu podľa ID (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);
}
// Vytvorenie nového produktu (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);
}
// Aktualizácia existujúceho produktu (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();
}
// Odstránenie produktu (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);
}