@Controller @RequestMapping( "/custom" ) public class CustomController { @Autowired private PositionService ps; @RequestMapping( "positions" ) public @ResponseBody List<User> getPositions( @RequestParam String positionName ) { return ps.getByName(positionName); } }
Po pierwsze dodajemy adnotację @Controller dzięki temu system widzi klasę jako serwlet. Ścieżka do serwletu oznaczonego adnotacją @Controller zaczyna się od api/. Adnotacja @RequestMapping pozwala na zdefiniowanie ścieżki do serwletu. Jak widzimy w przykładzie mamy dwie takie adnotacje, które wraz z przedrostkiem api/ tworzą ścieżkę do serwletu. Dla naszego przykładu ścieżka będzie następująca: api/custom/positions. Dzięki oznaczeniu @ResponseBody odpowiedź serwletu jest automatycznie konwertowana do formatu JSON. Ostatnia adnotacja @RequestParam pozwala na odczytanie parametru przekazanego przez serwlet. Parametr może być również obiektem zakodowanym w JSON, wtedy system automatycznie go zdekoduje.
Metody żądania
Definiowanie metody żądania odbywa się za pomocą adnotacji @RequestMapping( method = "method" ).
Podstawowe metody są następujące:
- RequestMethod.GET
- RequestMethod.POST
- RequestMethod.DELETE
Dla powyższego przykładu pobranie pozycji za pomocą metody GET będzie wyglądać następująco:
@RequestMapping( value = "positions", method = RequestMethod.GET ) public @ResponseBody List<User> getPositions( @RequestParam String positionName ) { return ps.getByName(positionName); }
Przekazywanie parametrów w linku
@RequestMapping( value = "positions/{positionName}", method = RequestMethod.GET ) public @ResponseBody List<User> getPositions( @PathVariable String positionName ) { return ps.getByName(positionName); }
Istnieje możliwość przesyłania podstawowych parametrów w linku RESTowym żądania. Zmienną taką należy umieścić w klamrach {}, a następnie przekazać ją do metody za pomocą odczytania parametru
@PathVariable String positionName. Teraz jeżeli wywołamy url: api/custom/positions/test, to jako parametr positionName zostanie do matody przekazana wartość test.
Przydatne zasoby:
Pobieranie pliku
Klasa com.suncode.pwfl.web.support.io.DownloadResource ułatwia stworzenie serwletu do pobierania pliku, dbając o ustawienie odpowiednich nagłówków odpowiedzi HTTP:
- Content-Disposition - nagłówek zawierający nazwę pliku (nazwa pliku może zawierać również znaki UTF-8)
- Content-Type - typ pliku odczytany z rozszerzenia za pomocą JAF (JavaBeans Activation Framework)
- Content-Length - rozmiar pliku
W tym celu należy z dowolnej metody kontrolera Spring MVC (@Controller) zwrócić odpowiedni obiekt klasy DownloadResource. Zasób ten zostanie automatycznie przekazany do przeglądarki z odpowiednimi nagłówkami. Należy pamiętać o adnotacji @ResponseBody która musi być obecna na metodzie.
Poniżej znajduje się przykład takiego kontrolera wraz z przykładową odpowiedzią serwera.
@Controller @RequestMapping("/file") public class DownloadFileServlet() { @RequestMapping( value = "download/{filePath}", method = RequestMethod.GET ) public @ResponseBody DownloadResource download( @PathVariable String filePath ) throws Exception { File file = new File(filePath); return new DownloadResource( file ); } }
Nagłówek | Wartość |
---|---|
Content-Disposition | attachment; filename="Faktury_ca%C5%82o%C5%9B%C4%87.pdf"; filename*=UTF-8''Faktury_ca%C5%82o%C5%9B%C4%87.pdf |
Content-Length | 15913 |
Content-Type | application/pdf;charset=UTF-8 |