JavaRush /Blog Jawa /Random-JV /Ringkesan REST. Part 3: Nggawe Layanan RESTful ing Spring...

Ringkesan REST. Part 3: Nggawe Layanan RESTful ing Spring Boot

Diterbitake ing grup
Iki minangka bagéan pungkasan saka parsing REST. Ing bagean sadurunge: Ringkesan REST.  Bagean 3: Nggawe Layanan RESTful ing Spring Boot - 1

Nggawe Proyek

Ing bagean iki, kita bakal nggawe aplikasi RESTful cilik nggunakake Spring Boot. Aplikasi kita bakal ngetrapake operasi CRUD (Gawe, Waca, Nganyari, Busak) ing klien saka conto saka bagean pungkasan analisis. Pisanan, ayo nggawe aplikasi Spring Boot anyar liwat menu File -> New -> Project... Ing jendhela sing mbukak, pilih Spring Initializr lan nemtokake Project SDK: Ringkesan REST.  Part 3: Nggawe Layanan RESTful ing Spring Boot - 2Klik tombol Sabanjure. Ing jendhela sabanjuré, nemtokake jinis project Maven, nemtokake Group lan Artefak: Ringkesan REST.  Part 3: Nggawe Layanan RESTful ing Spring Boot - 3Klik tombol Sabanjure. Ing jendela sabanjure, kita kudu milih komponen Spring Framework sing dibutuhake kanggo proyek kasebut. Spring Web bakal cukup kanggo kita: Ringkesan REST.  Part 3: Nggawe Layanan RESTful ing Spring Boot - 4Klik tombol Sabanjure. Sabanjure, sing isih ana yaiku nemtokake jeneng proyek lan lokasi ing sistem file: Ringkesan REST.  Part 3: Nggawe Layanan RESTful ing Spring Boot - 5Klik tombol Rampung. Proyèk wis digawe, saiki kita bisa ndeleng struktur sawijining: Ringkesan REST.  Part 3: Nggawe Layanan RESTful ing Spring Boot - 6IDEA wis kui kanggo kita Maven mbangun sistem penyebaran deskriptor - pom.xml lan kelas aplikasi utama: RestExampleApplication. Iki kode dheweke:
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>
Aplikasi RestExample:
@SpringBootApplication
public class RestExampleApplication {

   public static void main(String[] args) {
       SpringApplication.run(RestExampleApplication.class, args);
   }

}

Nggawe fungsi REST

Aplikasi kita ngatur klien. Dadi bab pisanan sing kudu ditindakake yaiku nggawe entitas pelanggan. Iki bakal dadi kelas POJO. Ayo nggawe paket modeling paket com.javarush.lectures.rest_example. modelAyo nggawe kelas ing paket kasebut 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;
   }
}
Layanan kasebut bakal ngetrapake operasi CRUD ing klien. Langkah sabanjure yaiku nggawe layanan sing bakal ngetrapake operasi kasebut. Ing paket com.javarush.lectures.rest_examplekita bakal nggawe paket service, ing jero kita bakal nggawe antarmuka ClientService. Punika kode antarmuka kanthi komentar:
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);
}
Sabanjure kita kudu nggawe implementasine antarmuka iki. Saiki bakal tumindak minangka repositori klien Map<Integer, Client>. Tombol kertu bakal dadi id klien, lan regane bakal dadi klien dhewe. Iki ditindakake supaya ora overload conto kanthi spesifik nggarap database. Nanging, ing mangsa ngarep kita bakal bisa nulis implementasine liyane saka antarmuka kang bakal bisa kanggo nyambungake database nyata. Ing paket servicekita bakal nggawe implementasine antarmuka 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;
   }
}
Anotasi @Servicengandhani Spring yen kelas iki minangka layanan. Iki minangka jinis kelas khusus ing ngendi sawetara logika bisnis aplikasi dileksanakake. Salajengipun, matur nuwun kanggo anotasi iki, Spring bakal menehi conto kelas iki ing papan sing dibutuhake nggunakake Injeksi Dependensi. Saiki wektu kanggo nggawe controller. Kelas khusus ing ngendi kita ngetrapake logika kanggo ngolah panjaluk klien kanggo titik pungkasan (URI). Kanggo nggawe luwih cetha, kita bakal nggawe kelas iki ing bagean. Pisanan, ayo nggawe kelas kasebut dhewe lan ngenalake dependensi kasebut ClientService:
@RestController
public class ClientController {

   private final ClientService clientService;

   @Autowired
   public ClientController(ClientService clientService) {
       this.clientService = clientService;
   }
}
Ayo njlentrehake anotasi: @RestController - ngandhani Spring yen kelas iki minangka pengontrol REST. Sing. kelas iki bakal ngleksanakake logika kanggo proses panjalukan klien @Autowired - ngandhani Spring sing ketergantungan kudu nyuntikaken ing panggonan iki. Kita ngirim antarmuka menyang konstruktor ClientService. Kita menehi tandha implementasine layanan iki kanthi anotasi @Servicesadurunge, lan saiki Spring bakal bisa ngirim conto implementasine menyang konstruktor pengontrol. Sabanjure, kita bakal langkah demi langkah ngleksanakake saben metode pengontrol kanggo ngolah operasi CRUD. Ayo dadi miwiti karo operasi Nggawe. Kanggo nindakake iki, ayo nulis metode create:
@PostMapping(value = "/clients")
public ResponseEntity<?> create(@RequestBody Client client) {
   clientService.create(client);
   return new ResponseEntity<>(HttpStatus.CREATED);
}
Ayo goleki cara iki: @PostMapping(value = "/clients")- ing kene tegese cara iki ngolah panjaluk POST menyang alamat / klien. Cara ngasilake ResponseEntity<?>. ResponseEntity- kelas khusus kanggo respon bali. Nggunakake, mengko bisa ngasilake kode status HTTP menyang klien. Cara njupuk parameter @RequestBody Client client, nilai parameter iki diganti saka awak panyuwunan. Abstrak ngomong babagan iki @RequestBody. Ing awak metode kasebut, kita nyebat metode nggawe ing layanan sing digawe sadurunge lan ngliwati pengontrol klien sing ditampa ing paramèter. Banjur kita bali status 201 Digawe dening nggawe obyek anyar ResponseEntitylan maringaken nilai enum dibutuhake kanggo iku HttpStatus. Sabanjure, kita ngleksanakake operasi Read: Kaping pisanan, kita ngleksanakake operasi kanggo entuk dhaptar kabeh klien sing kasedhiya:
@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);
}
Ayo miwiti analisis: @GetMapping(value = "/clients")- kabeh padha karo anotasi @PostMapping, mung saiki proses panjaluk GET. Wektu iki kita bali ResponseEntity<List<Client>>, mung wektu iki, saliyane status HTTP, kita uga bakal ngasilake awak respon, sing bakal dadi dhaptar klien. Ing pengontrol Spring REST, kabeh obyek POJO, uga koleksi obyek POJO sing bali minangka badan respon, bakal kanthi otomatis serialized kanggo JSON kajaba tegas kasebut. Iki cocog karo kita. Ing cara kasebut, nggunakake layanan kita, kita entuk dhaptar kabeh klien. Sabanjure, yen dhaptar ora null utawa kosong, kita bali ResponseEntitydhaftar klien lan status HTTP 200 OK nggunakake kelas. Yen ora, kita mung ngasilake status HTTP 404 Not Found. Sabanjure, kita bakal ngetrapake kemampuan kanggo nampa klien kanthi id:
@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);
}
Soko anyar yaiku saiki kita duwe variabel path. Variabel sing ditetepake ing URI. value = "/clients/{id}". We dituduhake ing kurung kriting. Lan ing paramèter metode kita nampa minangka intvariabel nggunakake anotasi @PathVariable(name = "id"). Cara iki bakal nampa panjalukan kanggo uri saka wangun /clients/{id}, nanging {id}bisa uga ana nilai numerik. Nilai iki banjur diterusake menyang variabel int id-parameter metode. Ing awak kita nampa obyek Clientnggunakake layanan kita lan ditampa id. Banjur, kanthi analogi karo dhaptar, kita bali status 200 OK lan obyek kasebut dhewe Client, utawa mung status 404 Ora Ditemokake, yen idora ana klien ing sistem kasebut. Iku tetep kanggo ngleksanakake rong operasi - Nganyari lan Busak. Iki kode kanggo metode kasebut:
@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);
}
Ora ana apa-apa sing anyar ing metode kasebut, mula kita bakal ngliwati katrangan sing rinci. Siji-sijine sing kudu dicritakake yaiku metode updatengolah panjaluk PUT (anotasi @PutMapping), lan metode kasebut deletengolah panjaluk DELETE (anotasi DeleteMapping). Punika kode controller lengkap:
@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);
   }
}
Akibaté, struktur proyek kita katon kaya iki: Ringkesan REST.  Part 3: Nggawe Layanan RESTful ing Spring Boot - 7

Bukak lan testing

Kanggo mbukak aplikasi kita, mung mbukak metode maining kelas RestExampleApplication. Lan kanggo nyoba layanan web RESTful, sampeyan kudu ndownload piranti lunak anyar) Kasunyatane manawa panjaluk GET cukup gampang dikirim saka browser biasa, nanging kanggo POST, PUT lan DELETE browser biasa ora cukup. Aja kuwatir: sampeyan bisa nggunakake Postman kanggo ngirim panjalukan HTTP. Sampeyan bisa ngundhuh saka kene . Sawise ngundhuh lan nginstal, kita miwiti nyoba aplikasi kita. Kanggo nindakake iki, bukak program lan gawe panjalukan anyar: Ringkesan REST.  Part 3: Nggawe Layanan RESTful ing Spring Boot - 9Klik tombol Anyar ing pojok kiwa ndhuwur. Sabanjure, pilih Panjaluk: Ringkesan REST.  Part 3: Nggawe Layanan RESTful ing Spring Boot - 10Sabanjure, wenehi jeneng banjur simpen. Ayo saiki nyoba ngirim panjalukan POST menyang server lan nggawe klien pisanan: Ringkesan REST.  Part 3: Nggawe Layanan RESTful ing Spring Boot - 11Kita nggawe sawetara klien kanthi cara iki. Banjur kita ngganti jinis panjaluk menyang GET lan dikirim menyang server: Ringkesan REST.  Part 3: Nggawe Layanan RESTful ing Spring Boot - 12

asil umum

Sugeng: kita wis ngrampungake topik REST. Kabeh materi ternyata akeh banget, nanging muga-muga bisa migunani kanggo sampeyan:
  1. Kita sinau apa REST.

  2. Kita kenal karo sejarah REST.

  3. Kita ngomong babagan watesan lan prinsip gaya arsitektur iki:

    • nggawa arsitektur menyang model klien-server;
    • kurang kahanan;
    • caching;
    • keseragaman antarmuka;
    • lapisan;
    • kode sing dikarepake (watesan opsional).
  4. Kita mriksa kaluwihan sing diwenehake REST

  5. Kita nliti kanthi rinci babagan carane server lan klien sesambungan karo siji liyane nggunakake protokol HTTP.

  6. Ayo dideleng kanthi luwih rinci babagan panjaluk lan tanggapan kasebut. Komponen padha disassembled.

  7. Pungkasan, kita nerusake latihan lan nulis aplikasi RESTful cilik kita ing Spring Boot. Lan kita malah sinau carane nyoba nggunakake program Postman.

Phew. Ternyata akeh banget, nanging ana sing kudu ditindakake minangka peer.

Peer

Coba ing ngisor iki:
  1. Sawise katrangan ing ndhuwur, gawe proyek Spring Boot dhewe lan gunakake logika sing padha kaya ing kuliah. Baleni kabeh 1 ing 1.
  2. Bukak. aplikasi.
  3. Ngundhuh lan nyiyapake Postman (utawa alat liyane kanggo ngirim panjaluk, malah nggulung).
  4. Tes panjalukan POST lan GET kanthi cara sing padha kaya sing diterangake ing kuliah.
  5. Tes PUT lan DELETE njaluk dhewe.
Part 1: Apa REST Part 2: Komunikasi antarane klien lan server
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION