Бұл REST талдауының соңғы бөлігі. Алдыңғы бөлімдерде:
Жоба құру
Бұл бөлімде біз Spring Boot көмегімен шағын RESTful қолданбасын жасаймыз. Біздің қолданба талдаудың соңғы бөлігіндегі мысалдағы клиенттерге CRUD (Жасау, оқу, жаңарту, жою) операцияларын жүзеге асырады . Алдымен File -> New -> Project мәзірі арқылы жаңа Spring Boot қолданбасын жасайық ... Ашылған терезеде Spring Initializr таңдап, Project SDK параметрін көрсетіңіз: Келесі түймесін басыңыз. Келесі терезеде Maven жобасының түрін көрсетіңіз, Топты және Артефактты көрсетіңіз: Келесі түймешігін басыңыз. Келесі терезеде жобаға қажетті Spring Framework компоненттерін таңдауымыз керек. Spring Web бізге жеткілікті болады: Келесі түймесін басыңыз. Әрі қарай, жобаның атын және оның файлдық жүйедегі орнын көрсету ғана қалады: Аяқтау түймесін басыңыз. Жоба жасалды, енді біз оның құрылымын көре аламыз: IDEA біз үшін Maven құрастыру жүйесін орналастыру дескрипторын - pom.xml және қолданбаның негізгі класын жасады:RestExampleApplication
. Міне олардың codeы:
pom.xml:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.2.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.javarush.lectures</groupId>
<artifactId>rest_example</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>rest_example</name>
<description>REST example project</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
RestExampleApplication:
@SpringBootApplication
public class RestExampleApplication {
public static void main(String[] args) {
SpringApplication.run(RestExampleApplication.class, args);
}
}
REST функциясын жасау
Біздің қолданба клиенттерді басқарады. Сондықтан бізге бірінші кезекте тұтынушы ұйымын құру керек. Бұл POJO сыныбы болады.model
Пакет ішінде бума жасайық com.javarush.lectures.rest_example
. Пакет ішінде model
класс құрайық Client
:
public class Client {
private Integer id;
private String name;
private String email;
private String phone;
public Integer getId() {
return id;
}
public void setId(Integer 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;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
}
Қызмет клиентте CRUD операцияларын жүзеге асырады. Келесі қадам осы операцияларды жүзеге асыратын қызметті құру болып табылады. Пакетте com.javarush.lectures.rest_example
біз пакет жасаймыз service
, оның ішінде интерфейс жасаймыз ClientService
. Міне, түсініктемелері бар интерфейс codeы:
public interface ClientService {
/**
* Создает нового клиента
* @param client - клиент для создания
*/
void create(Client client);
/**
* returns список всех имеющихся клиентов
* @return список клиентов
*/
List<client> readAll();
/**
* returns клиента по его ID
* @param id - ID клиента
* @return - an object клиента с заданным ID
*/
Client read(int id);
/**
* Обновляет клиента с заданным ID,
* в соответствии с переданным клиентом
* @param client - клиент в соответсвии с которым нужно обновить данные
* @param id - id клиента которого нужно обновить
* @return - true если данные были обновлены, иначе false
*/
boolean update(Client client, int id);
/**
* Удаляет клиента с заданным ID
* @param id - id клиента, которого нужно удалить
* @return - true если клиент был удален, иначе false
*/
boolean delete(int id);
}
Содан кейін біз осы интерфейстің іске асырылуын жасауымыз керек. Енді ол клиенттік репозиторий ретінде әрекет етеді Map<Integer, Client>
. Карта кілті клиент идентификаторы болады, ал мән клиенттің өзі болады. Бұл мысалды деректер қорымен жұмыс істеу ерекшеліктерімен шамадан тыс жүктемеу үшін жасалды. Дегенмен, болашақта біз нақты дерекқорды қосуға болатын интерфейстің басқа іске асырылуын жаза аламыз. Пакетте service
интерфейстің іске асырылуын жасаймыз ClientService
:
@Service
public class ClientServiceImpl implements ClientService {
// Хранorще клиентов
private static final Map<Integer, Client> CLIENT_REPOSITORY_MAP = new HashMap<>();
// Переменная для генерации ID клиента
private static final AtomicInteger CLIENT_ID_HOLDER = new AtomicInteger();
@Override
public void create(Client client) {
final int clientId = CLIENT_ID_HOLDER.incrementAndGet();
client.setId(clientId);
CLIENT_REPOSITORY_MAP.put(clientId, client);
}
@Override
public List<Client> readAll() {
return new ArrayList<>(CLIENT_REPOSITORY_MAP.values());
}
@Override
public Client read(int id) {
return CLIENT_REPOSITORY_MAP.get(id);
}
@Override
public boolean update(Client client, int id) {
if (CLIENT_REPOSITORY_MAP.containsKey(id)) {
client.setId(id);
CLIENT_REPOSITORY_MAP.put(id, client);
return true;
}
return false;
}
@Override
public boolean delete(int id) {
return CLIENT_REPOSITORY_MAP.remove(id) != null;
}
}
Аннотация @Service
көктемге бұл сыныптың қызмет екенін айтады. Бұл қолданбаның кейбір бизнес логикасы жүзеге асырылатын сыныптың ерекше түрі. Кейіннен, осы annotationның арқасында Spring бізге тәуелділік инъекциясын қолдану арқылы қажет жерлерде осы сыныптың данасын береді. Енді контроллерді жасау уақыты келді. Соңғы нүктелер (URI) үшін клиенттік сұрауларды өңдеу логикасын жүзеге асыратын арнайы сынып. Түсінікті болу үшін біз бұл классты бөліктерге бөлеміз. Алдымен класстың өзін жасап, оған тәуелділікті енгізейік ClientService
:
@RestController
public class ClientController {
private final ClientService clientService;
@Autowired
public ClientController(ClientService clientService) {
this.clientService = clientService;
}
}
Аннотацияларды нақтылайық: @RestController - Spring бұл класс REST контроллері екенін айтады. Анау. бұл класс клиенттің сұрауларын өңдеу логикасын жүзеге асырады @Autowired - көктемге осы жерге тәуелділікті енгізу керек екенін айтады. Біз интерфейсті конструкторға береміз ClientService
. Біз бұл қызметті іске асыруды бұрын annotationмен белгіледік @Service
, енді Spring осы іске асырудың данасын контроллер конструкторына бере алады. Әрі қарай, CRUD операцияларын өңдеу үшін әрбір контроллер әдісін кезең-кезеңмен енгіземіз. Жасау операциясынан бастайық. Ол үшін әдісті жазайық create
:
@PostMapping(value = "/clients")
public ResponseEntity<?> create(@RequestBody Client client) {
clientService.create(client);
return new ResponseEntity<>(HttpStatus.CREATED);
}
Бұл әдісті қарастырайық: @PostMapping(value = "/clients")
- мұнда бұл әдіс POST сұрауларын /clients мекенжайына өңдейтінін білдіреді.Әдіс қайтарады ResponseEntity<?>
. ResponseEntity
- жауаптарды қайтаруға арналған арнайы сынып. Оны пайдалану арқылы біз HTTP күй codeын клиентке кейін қайтара аламыз. Әдіс параметрді қабылдайды @RequestBody Client client
, бұл параметрдің мәні сұрау денесінен ауыстырылады. Аннотация бұл туралы айтады @RequestBody
. Әдістің денесінің ішінде біз бұрын жасалған қызметте құру әдісін шақырамыз және оны параметрлерде қабылданған клиент контроллеріне береміз. ResponseEntity
Содан кейін біз жаңа нысан жасау және оған қажетті санау мәнін беру арқылы 201 Created күйін қайтарамыз HttpStatus
. Содан кейін біз операцияны орындаймыз Read
: Біріншіден, біз барлық қолжетімді клиенттердің тізімін алу операциясын орындаймыз:
@GetMapping(value = "/clients")
public ResponseEntity<List<Client>> read() {
final List<Client> clients = clientService.readAll();
return clients != null && !clients.isEmpty()
? new ResponseEntity<>(clients, HttpStatus.OK)
: new ResponseEntity<>(HttpStatus.NOT_FOUND);
}
Талдауды бастайық: @GetMapping(value = "/clients")
- бәрі annotationға ұқсас @PostMapping
, тек қазір біз GET сұрауларын өңдейміз. Бұл жолы біз қайтарамыз ResponseEntity<List<Client>>
, тек осы жолы, HTTP күйіне қосымша, біз клиенттердің тізімі болатын жауап корпусын да қайтарамыз. Spring REST контроллерлерінде, егер басқаша анық көрсетілмесе, барлық POJO нысандары, сондай-ақ жауап органдары ретінде қайтарылатын POJO нысандарының жинақтары автоматты түрде JSON жүйесіне серияланады. Бұл бізге өте қолайлы. Әдістің ішінде біздің қызметімізді пайдалана отырып, біз барлық клиенттердің тізімін аламыз. Әрі қарай, егер тізім бос немесе бос болмаса, біз ResponseEntity
сыныпты пайдаланып клиенттер тізімін және HTTP күйін 200 OK қайтарамыз. Әйтпесе, біз жай ғана HTTP күйін қайтарамыз 404 Табылмады. Содан кейін біз клиентті оның идентификаторы бойынша қабылдау мүмкіндігін енгіземіз:
@GetMapping(value = "/clients/{id}")
public ResponseEntity<Client> read(@PathVariable(name = "id") int id) {
final Client client = clientService.read(id);
return client != null
? new ResponseEntity<>(client, HttpStatus.OK)
: new ResponseEntity<>(HttpStatus.NOT_FOUND);
}
Жаңа нәрсе - қазір бізде жол айнымалысы бар. URI-де анықталған айнымалы. value = "/clients/{id}"
. Біз бұйра жақшамен белгіледік. int
Ал әдіс параметрлерінде annotationны пайдаланып айнымалы ретінде қабылдаймыз @PathVariable(name = "id")
. Бұл әдіс пішіннің uri үшін сұрауларды қабылдайды /clients/{id}
, оның орнына {id}
кез келген сандық мән болуы мүмкін. Бұл мән кейін айнымалыға — әдіс параметріне беріледі int id
. Денеде біз Client
қызметімізді пайдалана отырып an objectіні аламыз және қабылдадық id
. Содан кейін тізімге ұқсастық бойынша біз 200 OK күйін және нысанның өзін немесе жүйеде мұндай клиент болмаса Client
, жай ғана 404 Табылмады күйін қайтарамыз. id
Екі операцияны орындау қалады - Жаңарту және Жою. Міне, осы әдістердің codeы:
@PutMapping(value = "/clients/{id}")
public ResponseEntity<?> update(@PathVariable(name = "id") int id, @RequestBody Client client) {
final boolean updated = clientService.update(client, id);
return updated
? new ResponseEntity<>(HttpStatus.OK)
: new ResponseEntity<>(HttpStatus.NOT_MODIFIED);
}
@DeleteMapping(value = "/clients/{id}")
public ResponseEntity<?> delete(@PathVariable(name = "id") int id) {
final boolean deleted = clientService.delete(id);
return deleted
? new ResponseEntity<>(HttpStatus.OK)
: new ResponseEntity<>(HttpStatus.NOT_MODIFIED);
}
Бұл әдістерде айтарлықтай жаңа ештеңе жоқ, сондықтан біз егжей-тегжейлі сипаттаманы өткізіп жібереміз. Айта кету керек, әдіс update
PUT сұрауларын өңдейді (annotation @PutMapping
) және әдіс delete
DELETE сұрауларын өңдейді (annotation DeleteMapping
). Міне контроллердің толық codeы:
@RestController
public class ClientController {
private final ClientService clientService;
@Autowired
public ClientController(ClientService clientService) {
this.clientService = clientService;
}
@PostMapping(value = "/clients")
public ResponseEntity<?> create(@RequestBody Client client) {
clientService.create(client);
return new ResponseEntity<>(HttpStatus.CREATED);
}
@GetMapping(value = "/clients")
public ResponseEntity<List<Client>> read() {
final List<client> clients = clientService.readAll();
return clients != null && !clients.isEmpty()
? new ResponseEntity<>(clients, HttpStatus.OK)
: new ResponseEntity<>(HttpStatus.NOT_FOUND);
}
@GetMapping(value = "/clients/{id}")
public ResponseEntity<Client> read(@PathVariable(name = "id") int id) {
final Client client = clientService.read(id);
return client != null
? new ResponseEntity<>(client, HttpStatus.OK)
: new ResponseEntity<>(HttpStatus.NOT_FOUND);
}
@PutMapping(value = "/clients/{id}")
public ResponseEntity<?> update(@PathVariable(name = "id") int id, @RequestBody Client client) {
final boolean updated = clientService.update(client, id);
return updated
? new ResponseEntity<>(HttpStatus.OK)
: new ResponseEntity<>(HttpStatus.NOT_MODIFIED);
}
@DeleteMapping(value = "/clients/{id}")
public ResponseEntity<?> delete(@PathVariable(name = "id") int id) {
final boolean deleted = clientService.delete(id);
return deleted
? new ResponseEntity<>(HttpStatus.OK)
: new ResponseEntity<>(HttpStatus.NOT_MODIFIED);
}
}
Нәтижесінде жобамыздың құрылымы келесідей болады:
Іске қосу және тестілеу
Қолданбамызды іске қосу үшінmain
сыныптағы әдісті іске қосыңыз RestExampleApplication
. Ал RESTful веб-қызметтерін сынау үшін сізге жаңа бағдарламалық жасақтаманы жүктеп алу қажет) Шындығында, GET сұрауларын қарапайым браузерден жіберу өте оңай, бірақ POST, PUT және DELETE үшін қарапайым браузер жеткіліксіз. Уайымдамаңыз: кез келген HTTP сұрауларын жіберу үшін Postman пайдалана аласыз. Сіз оны осы жерден жүктей аласыз . Жүктеп алып, орнатқаннан кейін біз қолданбамызды тексеруді бастаймыз. Ол үшін бағдарламаны ашып, жаңа сұраныс жасаңыз: Жоғарғы сол жақ бұрыштағы Жаңа түймешігін басыңыз. Содан кейін Сұраныс таңдаңыз: Содан кейін оған ат беріңіз және оны сақтаңыз. Енді serverге POST сұрауын жіберіп, бірінші клиентті жасауға тырысайық: Біз осылайша бірнеше клиент жасаймыз. Содан кейін сұрау түрін GET деп өзгертеміз және оны serverге жібереміз:
Жалпы нәтижелер
Құттықтаймыз: біз REST тақырыбын толық қамтыдық. Барлық материал көлемді болды, бірақ бұл сізге пайдалы болады деп үміттенеміз:-
Біз REST дегеннің не екенін білдік.
-
Біз REST тарихымен таныстық.
-
Біз осы архитектуралық стильдің шектеулері мен принциптері туралы айттық:
- архитектураны клиент-server моделіне келтіру;
- жағдайдың болмауы;
- кэштеу;
- интерфейстің біркелкілігі;
- қабаттар;
- сұраныс бойынша code (міндетті емес шектеу).
-
Біз REST беретін артықшылықтарды қарастырдық
-
Біз server мен клиенттің HTTP протоколы арқылы бір-бірімен қалай әрекеттесетінін егжей-тегжейлі қарастырдық.
-
Өтініштер мен жауаптарды толығырақ қарастырайық. Олардың құрамдас бөліктері бөлшектелді.
-
Соңында біз жаттығуға көшіп, Spring Boot бағдарламасында өзіміздің шағын RESTful қосымшамызды жаздық. Біз тіпті Postman бағдарламасы арқылы тестілеуді үйрендік.
Үй жұмысы
Келесі әрекеттерді орындап көріңіз:- Жоғарыдағы сипаттамадан кейін өзіңіздің Spring Boot жобаңызды жасаңыз және оған лекциядағыдай логиканы енгізіңіз. Барлығын 1-де қайталаңыз.
- Оны іске қосыңыз. қолдану.
- Пошташыны жүктеп алыңыз және орнатыңыз (немесе сұрауларды жіберуге арналған кез келген басқа құрал, тіпті бұралу).
- POST және GET сұрауларын дәрісте сипатталғандай сынаңыз.
- PUT және DELETE сұрауларын өзіңіз тексеріңіз.
GO TO FULL VERSION