JavaRush /Java блогы /Random-KK /REST туралы шолу. 3-бөлім: Spring Boot бағдарламасында RE...

REST туралы шолу. 3-бөлім: Spring Boot бағдарламасында RESTful қызметін жасау

Топта жарияланған
Бұл REST талдауының соңғы бөлігі. Алдыңғы бөлімдерде: REST туралы шолу.  3-бөлім: Spring Boot бағдарламасында RESTful қызметін жасау - 1

Жоба құру

Бұл бөлімде біз Spring Boot көмегімен шағын RESTful қолданбасын жасаймыз. Біздің қолданба талдаудың соңғы бөлігіндегі мысалдағы клиенттерге CRUD (Жасау, оқу, жаңарту, жою) операцияларын жүзеге асырады . Алдымен File -> New -> Project мәзірі арқылы жаңа Spring Boot қолданбасын жасайық ... Ашылған терезеде Spring Initializr таңдап, Project SDK параметрін көрсетіңіз: REST туралы шолу.  3-бөлім: Spring Boot бағдарламасында RESTful қызметін жасау - 2Келесі түймесін басыңыз. Келесі терезеде Maven жобасының түрін көрсетіңіз, Топты және Артефактты көрсетіңіз: REST туралы шолу.  3-бөлім: Spring Boot бағдарламасында RESTful қызметін жасау - 3Келесі түймешігін басыңыз. Келесі терезеде жобаға қажетті Spring Framework компоненттерін таңдауымыз керек. Spring Web бізге жеткілікті болады: REST туралы шолу.  3-бөлім: Spring Boot бағдарламасында RESTful қызметін жасау - 4Келесі түймесін басыңыз. Әрі қарай, жобаның атын және оның файлдық жүйедегі орнын көрсету ғана қалады: REST туралы шолу.  3-бөлім: Spring Boot бағдарламасында RESTful қызметін жасау - 5Аяқтау түймесін басыңыз. Жоба жасалды, енді біз оның құрылымын көре аламыз: REST туралы шолу.  3-бөлім: Spring Boot бағдарламасында RESTful қызметін жасау - 6IDEA біз үшін 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);
}
Бұл әдістерде айтарлықтай жаңа ештеңе жоқ, сондықтан біз егжей-тегжейлі сипаттаманы өткізіп жібереміз. Айта кету керек, әдіс updatePUT сұрауларын өңдейді (annotation @PutMapping) және әдіс deleteDELETE сұрауларын өңдейді (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);
   }
}
Нәтижесінде жобамыздың құрылымы келесідей болады: REST туралы шолу.  3-бөлім: Spring Boot бағдарламасында RESTful қызметін жасау - 7

Іске қосу және тестілеу

Қолданбамызды іске қосу үшін mainсыныптағы әдісті іске қосыңыз RestExampleApplication. Ал RESTful веб-қызметтерін сынау үшін сізге жаңа бағдарламалық жасақтаманы жүктеп алу қажет) Шындығында, GET сұрауларын қарапайым браузерден жіберу өте оңай, бірақ POST, PUT және DELETE үшін қарапайым браузер жеткіліксіз. Уайымдамаңыз: кез келген HTTP сұрауларын жіберу үшін Postman пайдалана аласыз. Сіз оны осы жерден жүктей аласыз . Жүктеп алып, орнатқаннан кейін біз қолданбамызды тексеруді бастаймыз. Ол үшін бағдарламаны ашып, жаңа сұраныс жасаңыз: REST туралы шолу.  3-бөлім: Spring Boot бағдарламасында RESTful қызметін жасау - 9Жоғарғы сол жақ бұрыштағы Жаңа түймешігін басыңыз. Содан кейін Сұраныс таңдаңыз: Обзор REST. Часть 3: создание RESTful сервиса на Spring Boot - 10Содан кейін оған ат беріңіз және оны сақтаңыз. Енді serverге POST сұрауын жіберіп, бірінші клиентті жасауға тырысайық: Обзор REST. Часть 3: создание RESTful сервиса на Spring Boot - 11Біз осылайша бірнеше клиент жасаймыз. Содан кейін сұрау түрін GET деп өзгертеміз және оны serverге жібереміз: Обзор REST. Часть 3: создание RESTful сервиса на Spring Boot - 12

Жалпы нәтижелер

Құттықтаймыз: біз REST тақырыбын толық қамтыдық. Барлық материал көлемді болды, бірақ бұл сізге пайдалы болады деп үміттенеміз:
  1. Біз REST дегеннің не екенін білдік.

  2. Біз REST тарихымен таныстық.

  3. Біз осы архитектуралық стильдің шектеулері мен принциптері туралы айттық:

    • архитектураны клиент-server моделіне келтіру;
    • жағдайдың болмауы;
    • кэштеу;
    • интерфейстің біркелкілігі;
    • қабаттар;
    • сұраныс бойынша code (міндетті емес шектеу).
  4. Біз REST беретін артықшылықтарды қарастырдық

  5. Біз server мен клиенттің HTTP протоколы арқылы бір-бірімен қалай әрекеттесетінін егжей-тегжейлі қарастырдық.

  6. Өтініштер мен жауаптарды толығырақ қарастырайық. Олардың құрамдас бөліктері бөлшектелді.

  7. Соңында біз жаттығуға көшіп, Spring Boot бағдарламасында өзіміздің шағын RESTful қосымшамызды жаздық. Біз тіпті Postman бағдарламасы арқылы тестілеуді үйрендік.

Фу. Бұл көлемді болып шықты, бірақ соған қарамастан үй тапсырмасын орындау керек нәрсе бар.

Үй жұмысы

Келесі әрекеттерді орындап көріңіз:
  1. Жоғарыдағы сипаттамадан кейін өзіңіздің Spring Boot жобаңызды жасаңыз және оған лекциядағыдай логиканы енгізіңіз. Барлығын 1-де қайталаңыз.
  2. Оны іске қосыңыз. қолдану.
  3. Пошташыны жүктеп алыңыз және орнатыңыз (немесе сұрауларды жіберуге арналған кез келген басқа құрал, тіпті бұралу).
  4. POST және GET сұрауларын дәрісте сипатталғандай сынаңыз.
  5. PUT және DELETE сұрауларын өзіңіз тексеріңіз.
1-бөлім: REST дегеніміз не 2-бөлім: Клиент пен server арасындағы байланыс
Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION