RESTful API – projektowanie pierwszego endpointa

TL;DR: REST API to sposób komunikacji między aplikacjami przez HTTP. W tym artykule nauczysz się stworzyć pierwszy endpoint w Spring Boot – od konfiguracji projektu po testowanie w przeglądarce. Potrzebujesz podstawowej znajomości Java i HTTP.

Jeśli programujesz w Javie, wcześniej czy później spotkasz się z potrzebą stworzenia API. Możesz mieć aplikację desktopową, która musi wysyłać dane do serwera, albo stronę internetową, która pobiera informacje z bazy danych. W obu przypadkach REST API jest najbardziej popularnym rozwiązaniem.

Dlaczego REST API jest ważne

REST (Representational State Transfer) to architektoniczny styl projektowania API, który wykorzystuje standardowe metody HTTP. Zamiast wymyślać własny protokół komunikacji, używasz tego co już istnieje – GET do pobierania danych, POST do dodawania, PUT do aktualizacji, DELETE do usuwania.

W 2015 roku REST stał się standardem w branży. Firmy jak Twitter, Facebook czy Google udostępniają swoje usługi właśnie przez REST API. Umiejętność tworzenia takich interfejsów to podstawa nowoczesnego programowania.

Co się nauczysz:

  • Jak stworzyć pierwszy REST endpoint w Spring Boot
  • Jakie są podstawowe metody HTTP i kiedy ich używać
  • Jak zwracać dane w formacie JSON
  • Jak testować API bez specjalistycznych narzędzi
  • Jakich błędów unikać przy projektowaniu URL-i

Wymagania wstępne:

  • Podstawowa znajomość Java (klasy, obiekty, metody)
  • Rozumienie czym jest HTTP i jak działają strony internetowe
  • Zainstalowane JDK 8+ i Maven
  • IDE typu IntelliJ IDEA lub Eclipse

Czym dokładnie jest REST API

Analogia: REST API to jak karta menu w restauracji. Każde danie (endpoint) ma swoją nazwę (URL) i opis (co zwraca). Kelner (HTTP) przyjmuje zamówienie (request) i przynosi jedzenie (response). Proste i zrozumiałe dla wszystkich.

REST API składa się z kilku kluczowych elementów:

  • Endpoint – konkretny adres URL, pod którym dostępna jest usługa
  • Metoda HTTP – określa co chcemy zrobić (GET, POST, PUT, DELETE)
  • Request – żądanie wysłane przez klienta
  • Response – odpowiedź serwera, zwykle w formacie JSON
JSON (JavaScript Object Notation) – format wymiany danych, który jest łatwy do odczytania zarówno dla ludzi jak i komputerów. Przykład: {„name”: „Jan”, „age”: 25}

Pierwszy projekt Spring Boot

Spring Boot to framework, który znacznie upraszcza tworzenie aplikacji Java. W 2015 roku Spring Boot 1.2 wprowadził rewolucję – możesz stworzyć działającą aplikację web w kilka minut.

Konfiguracja projektu

Zacznij od stworzenia nowego projektu Maven z następującą strukturą:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0">
    <modelVersion>4.0.0</modelVersion>
    
    <groupId>com.example</groupId>
    <artifactId>rest-api-demo</artifactId>
    <version>1.0.0</version>
    <packaging>jar</packaging>
    
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.3.5.RELEASE</version>
        <relativePath/>
    </parent>
    
    <properties>
        <java.version>1.8</java.version>
    </properties>
    
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>
</project>
spring-boot-starter-web zawiera wszystko czego potrzebujesz do tworzenia REST API – embedded Tomcat, Spring MVC, Jackson do obsługi JSON.

Główna klasa aplikacji

Stwórz klasę główną aplikacji:

package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class RestApiDemoApplication {
    
    public static void main(String[] args) {
        SpringApplication.run(RestApiDemoApplication.class, args);
    }
}
@SpringBootApplication – adnotacja która łączy trzy inne: @Configuration, @EnableAutoConfiguration i @ComponentScan. To „magiczna” adnotacja Spring Boot.

Tworzenie pierwszego endpointa

Teraz stwórzmy nasz pierwszy REST endpoint. Będzie to prosty serwis zwracający informacje o użytkowniku:

package com.example.demo.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class UserController {
    
    @GetMapping("/users/{id}")
    public User getUser(@PathVariable Long id) {
        // W prawdziwej aplikacji pobierałbyś dane z bazy
        User user = new User();
        user.setId(id);
        user.setName("Jan Kowalski");
        user.setEmail("jan.kowalski@example.com");
        return user;
    }
    
    @GetMapping("/users")
    public String getAllUsers() {
        return "Lista wszystkich użytkowników - endpoint w budowie";
    }
}

Klasa User (model danych)

package com.example.demo.model;

public class User {
    private Long id;
    private String name;
    private String email;
    
    // Konstruktor domyślny wymagany przez Jackson
    public User() {}
    
    // Gettery i settery
    public Long getId() { return id; }
    public void setId(Long id) { this.id = id; }
    
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
    
    public String getEmail() { return email; }
    public void setEmail(String email) { this.email = email; }
}
Pro tip: Jackson (biblioteka do obsługi JSON w Spring Boot) automatycznie konwertuje obiekty Java na JSON. Dlatego metoda getUser() zwraca obiekt User, a klient otrzyma JSON.

Podstawowe metody HTTP w praktyce

HTTP oferuje kilka metod, każda ma swoje przeznaczenie:

Metoda HTTPPrzeznaczeniePrzykład URL
GETPobieranie danychGET /users/123
POSTTworzenie nowych zasobówPOST /users
PUTAktualizacja całego zasobuPUT /users/123
DELETEUsuwanie zasobuDELETE /users/123
Częsty błąd początkujących: Używanie GET do operacji, które zmieniają dane na serwerze. GET powinien być „bezpieczny” – wielokrotne wywołanie nie może zmieniać stanu aplikacji.

Rozszerzenie API o więcej metod

@RestController
public class UserController {
    
    // Symulujemy bazę danych prostą listą
    private List<User> users = new ArrayList<>();
    
    @GetMapping("/users/{id}")
    public User getUser(@PathVariable Long id) {
        return users.stream()
                   .filter(user -> user.getId().equals(id))
                   .findFirst()
                   .orElse(null);
    }
    
    @PostMapping("/users")
    public User createUser(@RequestBody User user) {
        user.setId(System.currentTimeMillis()); // Prosty generator ID
        users.add(user);
        return user;
    }
    
    @DeleteMapping("/users/{id}")
    public String deleteUser(@PathVariable Long id) {
        users.removeIf(user -> user.getId().equals(id));
        return "User deleted successfully";
    }
}
@RequestBody – mówi Spring Boot żeby przekonwertował JSON z żądania HTTP na obiekt Java. To przeciwność tego co robi automatycznie z odpowiedzią.

Testowanie API

Uruchom aplikację komendą mvn spring-boot:run lub przyciskiem Run w IDE. Spring Boot uruchomi embedded Tomcat na porcie 8080.

Testowanie w przeglądarce

Wpisz w przeglądarce:

  • http://localhost:8080/users/1 – sprawdzi endpoint GET
  • http://localhost:8080/users – sprawdzi listę użytkowników

Przeglądarka domyślnie wysyła żądania GET, dlatego innych metod (POST, DELETE) nie przetestujesz tak łatwo. Do tego potrzebujesz narzędzi typu Postman lub curl.

Testowanie z curl (wiersz poleceń)

# GET - pobieranie użytkownika
curl http://localhost:8080/users/1

# POST - tworzenie nowego użytkownika  
curl -X POST http://localhost:8080/users \
     -H "Content-Type: application/json" \
     -d '{"name":"Anna Nowak","email":"anna@example.com"}'

# DELETE - usuwanie użytkownika
curl -X DELETE http://localhost:8080/users/1

Najlepsze praktyki projektowania URL-i

URL w REST API powinien być intuicyjny i logiczny. Oto zasady które warto stosować:

✅ Dobre praktyki:

  • Używaj rzeczowników: /users zamiast /getUsers
  • Hierarchia zasobów: /users/123/orders dla zamówień użytkownika 123
  • Liczba mnoga: /users zamiast /user
  • Małe litery: /users zamiast /Users
  • Myślniki zamiast podkreśleń: /user-profiles

❌ Unikaj tych błędów:

  • Czasowników w URL: /createUser, /deleteUser
  • Mieszania konwencji: /users/get_user/123
  • Zbyt głębokiej hierarchii: /users/123/orders/456/items/789/details

Obsługa błędów

W prawdziwej aplikacji rzeczy mogą pójść nie tak. Oto jak obsłużyć podstawowe błędy:

@GetMapping("/users/{id}")
public ResponseEntity<User> getUser(@PathVariable Long id) {
    User user = users.stream()
                    .filter(u -> u.getId().equals(id))
                    .findFirst()
                    .orElse(null);
    
    if (user == null) {
        return ResponseEntity.notFound().build(); // HTTP 404
    }
    
    return ResponseEntity.ok(user); // HTTP 200
}
ResponseEntity – klasa Spring która pozwala kontrolować dokładnie co zwracasz: status HTTP, nagłówki i treść odpowiedzi.

Common mistakes – błędy początkujących

Błąd #1: Zapominanie o adnotacji @RestController lub @ResponseBody – Spring zwraca wtedy nazwę view zamiast JSON.
Błąd #2: Brak konstruktora domyślnego w klasie modelu – Jackson nie może zdeserializować JSON.
Błąd #3: Używanie GET do operacji zmieniających dane – narusza zasady REST i może powodować problemy z cache’owaniem.
Błąd #4: Nie sprawdzanie czy aplikacja się uruchomiła – sprawdź konsolę czy nie ma błędów podczas startu.
Dlaczego mój endpoint zwraca 404?

Najprawdopodobniej controller nie jest w pakiecie skanowanym przez Spring Boot. Upewnij się że controller jest w tym samym pakiecie co klasa główna albo w podpakiecie.

Jak zwrócić listę obiektów?

Spring Boot automatycznie konwertuje List<User> na JSON array. Po prostu zwróć List<User> z metody oznaczonej @GetMapping.

Czy muszę używać Spring Boot?

Nie, ale Spring Boot znacznie upraszcza konfigurację. Alternatywnie możesz użyć czystego Spring MVC, JAX-RS lub innych frameworków.

Jak przetestować POST z przeglądarki?

Przeglądarki domyślnie wysyłają tylko GET. Do testowania POST użyj Postman, curl lub napisz prosty formularz HTML.

Dlaczego dostaję błąd 'Cannot resolve symbol JSON’?

JSON to format danych, nie klasa Java. Spring Boot automatycznie konwertuje obiekty na JSON – nie musisz importować żadnych dodatkowych bibliotek.

Jak zmienić port aplikacji?

Dodaj server.port=8081 do pliku application.properties w folderze src/main/resources.

Co oznacza @PathVariable?

@PathVariable pobiera wartość z URL. W przypadku /users/{id} i @PathVariable Long id, zmienna id będzie zawierać wartość z URL, np. dla /users/123 id=123.

Przydatne zasoby:

🚀 Zadanie dla Ciebie

Stwórz REST API dla biblioteki książek z endpointami:

  • GET /books – lista wszystkich książek
  • GET /books/{id} – szczegóły konkretnej książki
  • POST /books – dodanie nowej książki
  • PUT /books/{id} – aktualizacja książki
  • DELETE /books/{id} – usunięcie książki

Książka powinna mieć: id, tytuł, autor, rok wydania. Przetestuj wszystkie endpointy używając curl lub Postman.

Masz pytania o REST API w Spring Boot? Podziel się swoimi doświadczeniami w komentarzach – chętnie pomogę rozwiązać problemy!

Zostaw komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

Przewijanie do góry