Podejście REST (Representational State Transfer) i RPC (Remote Procedure Call) to dwa różne podejścia do tworzenia interfejsów API w kontekście aplikacji webowych. Oto porównanie tych dwóch podejść:
GET /products może być używane do pobrania listy produktów.Podsumowując, REST i RPC to różne podejścia do projektowania interfejsów API, z różnymi filozofiami i cechami. REST jest bardziej oparty na zasobach i operacjach na nich, podczas gdy RPC skupia się na wywoływaniu zdalnych procedur. Wybór między nimi zależy od konkretnych potrzeb projektu i preferencji dewelopera.
RESTful API:
Przykład RESTful API dla zarządzania listą zadań:
Kontroler i akcje:
[Route("api/[controller]")]
[ApiController]
public class TasksController : ControllerBase
{
private readonly ITaskService _taskService;
public TasksController(ITaskService taskService)
{
_taskService = taskService;
}
[HttpGet]
public IActionResult GetAllTasks()
{
var tasks = _taskService.GetAllTasks();
return Ok(tasks);
}
[HttpGet("{id}")]
public IActionResult GetTaskById(int id)
{
var task = _taskService.GetTaskById(id);
if (task == null)
return NotFound();
return Ok(task);
}
[HttpPost]
public IActionResult CreateTask(TaskDto taskDto)
{
var newTask = _taskService.CreateTask(taskDto);
return CreatedAtAction(nameof(GetTaskById), new { id = newTask.Id }, newTask);
}
[HttpPut("{id}")]
public IActionResult UpdateTask(int id, TaskDto taskDto)
{
var updatedTask = _taskService.UpdateTask(id, taskDto);
if (updatedTask == null)
return NotFound();
return Ok(updatedTask);
}
[HttpDelete("{id}")]
public IActionResult DeleteTask(int id)
{
var deleted = _taskService.DeleteTask(id);
if (!deleted)
return NotFound();
return NoContent();
}
}
Routing: Wykorzystujemy atrybuty [Route] na kontrolerze i akcjach do definiowania tras.
[Route("api/[controller]")]
Przykładowe żądania HTTP:
GET /api/tasksGET /api/tasks/1POST /api/tasksPUT /api/tasks/1DELETE /api/tasks/1RPC:
Przykład będzie bardziej zorientowany na wywoływanie zdalnych operacji, bez operacji na zasobach "tasks". Kontroler TaskRpcController, który zawierać będzie zdalne metody.
[Route("api/[controller]")]
[ApiController]
public class TaskRpcController : ControllerBase
{
private readonly ITaskService _taskService;
public TaskRpcController(ITaskService taskService)
{
_taskService = taskService;
}
[HttpGet("getTask/{id}")]
public IActionResult GetTask(int id)
{
var task = _taskService.GetTaskById(id);
if (task == null)
return NotFound();
return Ok(task);
}
[HttpPost("createTask")]
public IActionResult CreateTask(TaskDto taskDto)
{
var newTask = _taskService.CreateTask(taskDto);
return Ok(newTask);
}
[HttpPost("updateTask")]
public IActionResult UpdateTask(int id, TaskDto taskDto)
{
var updatedTask = _taskService.UpdateTask(id, taskDto);
if (updatedTask == null)
return NotFound();
return Ok(updatedTask);
}
[HttpPost("deleteTask")]
public IActionResult DeleteTask(int id)
{
var deleted = _taskService.DeleteTask(id);
if (!deleted)
return NotFound();
return NoContent();
}
}
W tym podejściu RPC, klient wywołuje zdalne metody na kontrolerze TaskRpcController, które odpowiadają operacjom na zadaniach. Teraz nie mamy operacji typowych dla zasobów "tasks" (takich jak GetAllTasks), ale skoncentrowaliśmy się na zdalnych operacjach do zarządzania zadaniami.
W przypadku RPC, klient wywołuje konkretne metody na kontrolerze, które są identyfikowane przez nazwy akcji. W przypadku RESTful API, klient operuje na zasobach, takich jak zadania, używając standardowych metod HTTP. Oba podejścia mają swoje miejsce w projektowaniu interfejsów API, w zależności od potrzeb projektu.