JavaRush /Java Blog /Random-TK /REST-e syn. 3-nji bölüm: Bahar aýakgabynda IEST GOWY hyzm...

REST-e syn. 3-nji bölüm: Bahar aýakgabynda IEST GOWY hyzmat döretmek

Toparda çap edildi
Bu, REST derňewiniň soňky bölümi. Öňki bölümlerde: REST-e syn.  3-nji bölüm: Bahar aýakgabynda IEST GOWY hyzmat döretmek - 1

Taslama döretmek

Bu bölümde, “Bahar Boot” -y ulanyp, kiçijik RESTful programma dörederis. Programmamyz , derňewiň soňky böleginden mysaldan müşderilere CRUD (Dörediň, okaň, täzeläň, pozuň) amallaryny amala aşyrar . Ilki bilen, Faýl -> Täze -> Taslama menýusy arkaly täze “Bahar Boot” programmasyny döredeliň ... Açylýan penjirede “Bahar Initializr” -i saýlaň we “SDK Taslama” -ny kesgitläň: “ REST-e syn.  3-nji bölüm: Bahar aýakgabynda IEST GOWY hyzmat döretmek - 2Indiki” düwmesine basyň. Indiki penjirede Maven taslamasynyň görnüşini görkeziň, Topar we Artifact görkeziň: REST-e syn.  3-nji bölüm: Bahar aýakgabynda IEST GOWY hyzmat döretmek - 3Indiki düwmesine basyň. Indiki penjirede taslama üçin zerur bolan “Bahar çarçuwasy” komponentlerini saýlamalydyrys. Bahar webi bize ýeterlik bolar: REST-e syn.  3-nji bölüm: Bahar aýakgabynda IEST GOWY hyzmat döretmek - 4Indiki düwmä basyň. Ondan soň galan zat, taslamanyň adyny we faýl ulgamynda ýerleşýän ýerini kesgitlemek: REST-e syn.  3-nji bölüm: Bahar aýakgabynda IEST GOWY hyzmat döretmek - 5“Finish” düwmesine basyň. Taslama döredildi, indi onuň gurluşyny görüp bileris: REST-e syn.  3-nji bölüm: Bahar aýakgabynda IEST GOWY hyzmat döretmek - 6IDEA biziň üçin Maven gurmak ulgamynyň ýerleşdiriş beýany - pom.xml we esasy programma synpyny döretdi : RestExampleApplication. Ine, olaryň kody:
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 funksiýasyny döretmek

Programmamyz müşderileri dolandyrýar. Şonuň üçin ilkinji etmeli zadymyz, müşderi guramasyny döretmekdir. Bu POJO synpy bolar. modelGeliň, bukjanyň içinde bukja döredeliň com.javarush.lectures.rest_example. Geliň, bukjanyň içinde modelsynp döredeliň 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;
   }
}
Hyzmat müşderide CRUD amallaryny amala aşyrar. Indiki ädim, bu amallary amala aşyrjak hyzmat döretmekdir. Bukjada interfeýs com.javarush.lectures.rest_exampledörederis . Ine teswirler bilen interfeýs kody: serviceClientService
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);
}
Ondan soň bu interfeýsiň ýerine ýetirilişini döretmeli. Indi ol müşderi ammary hökmünde çykyş eder Map<Integer, Client>. Kart açary müşderiniň ID-si, bahasy bolsa müşderiniň özi bolar. Bu, maglumatlar bazasy bilen işlemegiň aýratynlyklary bilen mysaly artykmaç ýüklemezlik üçin edildi. Şeýle-de bolsa, geljekde hakyky maglumat bazasyny birikdirip boljak interfeýsiň başga bir ýerine ýetirilişini ýazyp bileris. Bukjada serviceinterfeýsiň ýerine ýetirilişini dörederis 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;
   }
}
Annotasiýa @ServiceBaharyň bu synpyň bir hyzmatdygyny aýdýar. Bu programmanyň käbir iş logikasy ýerine ýetirilýän aýratyn synp görnüşidir. Netijede, bu düşündirişiň kömegi bilen, Bahar bize baglylyk sanjymyny ulanmak zerur bolan ýerlerde bu synpyň mysalyny berer. Indi kontrolleýeri döretmegiň wagty geldi. Müşderiniň ahyrky nokatlary (URI) isleglerini gaýtadan işlemek üçin logikany durmuşa geçirýän ýörite synpymyz. Has düşnükli etmek üçin bu synpy bölekleýin dörederis. Ilki bilen synpyň özüni döredeliň we oňa garaşlylygy girizeliň ClientService:
@RestController
public class ClientController {

   private final ClientService clientService;

   @Autowired
   public ClientController(ClientService clientService) {
       this.clientService = clientService;
   }
}
Annotasiýalary aýdyňlaşdyralyň: @RestController - Baharyň bu synpyň REST kontrolleýjidigini aýdýar. Bular. bu synp müşderi isleglerini gaýtadan işlemek üçin logikany durmuşa geçirer @Autowired - Bahara bu ýerde garaşlylygyň sanjym edilmelidigini aýdýar. Interfeýsi konstruktora geçirýäris ClientService. Bu hyzmatyň ýerine ýetirilişini öňem bellik bilen belledik @Service, indi Bahar bu ýerine ýetirişiň mysalyny kontrol konstruktoryna geçirip biler. Indiki, CRUD amallaryny gaýtadan işlemek üçin her bir gözegçilik usulyny ädimme-ädim durmuşa geçireris. “Döret” amalyndan başlalyň. Munuň üçin bir usul ýazalyň create:
@PostMapping(value = "/clients")
public ResponseEntity<?> create(@RequestBody Client client) {
   clientService.create(client);
   return new ResponseEntity<>(HttpStatus.CREATED);
}
Geliň, bu usula seredeliň: @PostMapping(value = "/clients")- bu ýerde bu usulyň / müşderileriň salgysyna POST haýyşlaryny gaýtadan işleýändigini aňladýarys. Usul gaýdyp gelýär ResponseEntity<?>. ResponseEntity- jogaplary yzyna gaýtarmak üçin ýörite synp. Ony ulanyp, soňundan HTTP status koduny müşderä gaýtaryp bileris. Usul bir parametr alýar @RequestBody Client client, bu parametriň bahasy haýyş organyndan çalşylýar. Abstrakt bu hakda aýdýar @RequestBody. Usulyň içinde, ozal döredilen hyzmatda döretmek usulyna jaň edýäris we parametrlerde kabul edilen müşderi gözegçisine geçýäris. ResponseEntitySoňra täze bir obýekt döretmek we zerur san bahasyny bermek arkaly döredilen 201 statusyny yzyna gaýtaryp berýäris HttpStatus. Ondan soň, amaly ýerine ýetirýäris Read: Ilki bilen, ähli müşderileriň sanawyny almak amalyny amala aşyrýarys:
@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);
}
Derňewi başlalyň: @GetMapping(value = "/clients")- hemme zat düşündirişe meňzeýär @PostMapping, diňe indi GET haýyşlaryny işleýäris. Bu gezek gaýdyp gelýäris ResponseEntity<List<Client>>, diňe şu gezek, HTTP ýagdaýyndan başga-da, müşderileriň sanawy boljak jogap organyny hem yzyna bereris. Bahar REST dolandyryjylarynda, POJO obýektleriniň hemmesi, şeýle hem jogap guramalary hökmünde yzyna gaýtarylýan POJO obýektleriniň ýygyndylary, başgaça görkezilmedik bolsa, awtomatiki usulda JSON-a seriýalaşdyrylýar. Bu bize gaty laýyk gelýär. Usulyň içinde, hyzmatymyzy ulanyp, ähli müşderileriň sanawyny alýarys. Ondan soň, sanaw boş ýa-da boş bolmasa, ResponseEntitymüşderileriň sanawyny we synpy ulanyp, HTTP ýagdaýy 200 OK-a gaýtaryp berýäris. Otherwiseogsam, HTTP statusyny 404 tapmaýarys. Ondan soň, müşderini şahsyýeti boýunça kabul etmek ukybyny durmuşa geçireris:
@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);
}
Täze bir zat, indi ýol üýtgeýjimiz bar. URI-de kesgitlenen üýtgeýji. value = "/clients/{id}". Biz ony egrilen ýaýlarda görkezdik. Usul parametrlerinde bolsa, intdüşündiriş ulanyp, üýtgeýji hökmünde kabul edýäris @PathVariable(name = "id"). /clients/{id}Bu usul , islendik {id}san bahasy bolup bilýän formanyň uri üçin haýyşlary kabul eder . Bu baha soňra üýtgeýjä - usul parametrine geçirilýär int id. Bedenimizde Clienthyzmatymyzy ulanyp obýekt alýarys we kabul edýäris id. Soň bolsa, sanaw bilen meňzeşlik bilen, ulgamda munuň bilen müşderi ýok bolsa , 200 OK ýagdaýyny ýa-da obýektiň özüni Clientýa-da diňe 404 Tapylmadyk statusyny gaýtaryp berýäris. idIki amaly ýerine ýetirmek galýar - Täzelenmek we Öçürmek. Ine, bu usullaryň kody:
@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);
}
Bu usullarda düýpgöter täze zat ýok, şonuň üçin jikme-jik düşündirişe geçeris. Onlyeke-täk bellemeli zat, usulyň updatePUT haýyşlaryny (annotasiýa @PutMapping), usuly bolsa deleteDELETE haýyşlaryny (düşündiriş DeleteMapping) işleýär. Ine, doly gözegçilik ediji kody:
@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);
   }
}
Netijede, taslamamyzyň gurluşy şeýle: REST-e syn.  3-nji bölüm: Bahar aýakgabynda IEST GOWY hyzmat döretmek - 7

Başlamak we synag

Programmamyzy işletmek üçin diňe usuly mainsynpda işlediň RestExampleApplication. Iň oňat web hyzmatlaryny synamak üçin täze programma üpjünçiligini göçürip almaly) Hakykat, GET haýyşlaryny adaty brauzerden ibermek aňsat, ýöne POST, PUT we DELETE üçin adaty brauzer ýeterlik däl. Alada etme: islendik HTTP islegini ibermek üçin Poçta ulanyp bilersiňiz. Bu ýerden göçürip alyp bilersiňiz . Göçürip we guranymyzdan soň, programmamyzy synap başlaýarys. Munuň üçin programmany açyň we täze haýyş dörediň: REST-e syn.  3-nji bölüm: Bahar aýakgabynda IEST GOWY hyzmat döretmek - 9Çep ýokarky burçdaky Täze düwmä basyň. Ondan soň haýyş: Indiki saýlaň Обзор REST. Часть 3: создание RESTful сервиса на Spring Boot - 10, oňa at beriň we ýazdyryň. Indi serwere POST haýyşyny ibermäge we ilkinji müşderini döretmäge synanyşalyň: Обзор REST. Часть 3: создание RESTful сервиса на Spring Boot - 11Bu görnüşde birnäçe müşderi döredýäris. Soňra haýyş görnüşini GET-e üýtgedýäris we serwere iberýäris: Обзор REST. Часть 3: создание RESTful сервиса на Spring Boot - 12

Umumy netijeler

Gutlaýarys: REST mowzugyny açdyk. Thehli materiallar göwrümli boldy, ýöne siziň üçin peýdaly bolar diýip umyt edýäris:
  1. REST-iň nämedigini öwrendik.

  2. REST-iň taryhy bilen tanyşdyk.

  3. Bu binagärlik stiliniň çäklendirmeleri we ýörelgeleri barada gürleşdik:

    • arhitekturany müşderi-serwer modeline getirmek;
    • ýagdaýyň bolmazlygy;
    • keş;
    • interfeýsiň birmeňzeşligi;
    • gatlaklar;
    • isleg boýunça kod (islege bagly çäklendirme).
  4. REST-iň berýän artykmaçlyklaryny gözden geçirdik

  5. Serwer bilen müşderiniň HTTP protokolyny ulanyp biri-biri bilen nähili täsirleşýändigini jikme-jik gözden geçirdik.

  6. Isleglere we jogaplara has içgin seredeliň. Komponentleri söküldi.

  7. Ahyrynda, tejribe geçdik we “Spring Boot” -da öz kiçijik RESTful programmamyzy ýazdyk. Hat-da “Poçta” programmasyny ulanyp nädip barlamalydygyny öwrendik.

Phew. Gaty göwrümli boldy, ýöne muňa garamazdan öý işi ýaly bir zat bar.

Öý işi

Aşakdakylary synap görüň:
  1. Aboveokardaky düşündirişe eýerip, “Bahar Boot” taslamasyny dörediň we leksiýadaky ýaly logikany durmuşa geçiriň. Hemme zady 1-den gaýtalaň.
  2. Başla. amaly.
  3. Poçta işgärini göçürip alyň (ýa-da haýyşlary ibermek üçin başga gural, hatda egrelmek).
  4. POST we GET haýyşlaryny leksiýada görkezilişi ýaly synap görüň.
  5. Synag PUT we DELETE özüňizden haýyş edýär.
1-nji bölüm: IEST GOWY 2-nji bölüm: Müşderi bilen serweriň arasyndaky aragatnaşyk
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION