JavaRush /Java Blog /Random-TK /REST API we başga bir synag meselesi.
Денис
Dereje
Киев

REST API we başga bir synag meselesi.

Toparda çap edildi
I bölüm: başlamak Nireden başlamaly? Geň zat, ýöne tehniki aýratynlyklardan. Iberilen TOR-ny okanyňyzdan soň, onda ýazylanlara we müşderiniň nämä garaşýandygyna doly göz ýetirmek möhümdir. Birinjiden, bu mundan beýläk durmuşa geçirmek üçin möhümdir, ikinjiden, sizden garaşylýan zady ýerine ýetirmeseňiz, bu siziň peýdasyna bolmaz. Howany ýitirmezlik üçin, ýönekeý tehniki spesifikasiýany düzeliň. Şeýlelik bilen, maglumat iberip biljek hyzmatymy isleýärin, ol hyzmatda saklanar we isleg boýunça maňa gaýtarylar. Şeýle hem, zerur bolsa bu maglumatlary täzeläp we pozmagy başarmaly . Bir-iki sözlem düşnükli zat ýaly däl, şeýlemi? Ol ýere nädip maglumat ibermek isleýärin? Haýsy tehnologiýalary ulanmaly? Bu maglumatlar haýsy formatda bolar? Şeýle hem gelýän we çykýan maglumatlaryň mysallary ýok. Netije - tehniki spesifikasiýa eýýäm erbet . Gaýtadan synamaga synanyşalyň: HTTP isleglerini gaýtadan işläp bilýän we geçirilen maglumatlar bilen işleýän hyzmat gerek. Bu işgärleriň ýazgylar bazasy bolar. Işgärlerimiz bolar, olar bölümler we hünärler boýunça bölünýärler, işgärleriň özlerine ýüklenen wezipeleri bolup biler. Biziň wezipämiz, hakyna tutulan, işden aýrylan, işden çykarylan işgärleri hasaba almak, şeýle hem REST API ulanyp wezipeleri bellemek we ýatyrmak prosesini awtomatlaşdyrmak. 1-nji etap hökmünde häzirki wagtda diňe işgärler bilen işleýäris. Hyzmatda onuň bilen işlemek üçin birnäçe ahyrky nokatlar bolmaly: - POST / işgär - POST haýyşy, bu işgär hakda maglumatlar bilen JSON obýektini kabul etmeli. Bu obýekt maglumatlar binýadynda saklanmalydyr, eger şeýle obýekt maglumatlar bazasynda eýýäm bar bolsa, meýdanlardaky maglumatlar täze maglumatlar bilen täzelenmeli. - GET / işgäri - Maglumatlar bazasynda saklanan işgärleriň tutuş sanawyny yzyna gaýtarýan haýyş - DELETE - DELETE / işgäri belli bir işgäri öçürmek üçin işgäriň maglumat modelini:
{
  "firstName": String,
  "lastName": String,
  "department": String,
  "salary": String
  "hired": String //"yyyy-mm-dd"
  "tasks": [
  	//List of tasks, not needed for Phase 1
  ]
}
II bölüm: Iş üçin gurallar Şeýlelik bilen, işiň gerimi has düşnükli, ýöne muny nädip etmeli? Elbetde, synagdaky şular ýaly meseleler birnäçe programma maksady bilen berilýär, nädip kodlaýandygyňyzy görmek, Bahary ulanmaga we maglumatlar bazasy bilen azajyk işlemäge mejbur etmek. Geliň, muny edeliň. Bize REST API goldawy we maglumat bazasy bolan “SpringBoot” taslamasy gerek. Https://start.spring.io/ web sahypasynda zerur zatlary tapyp bilersiňiz. REST API ýa-da başga bir synag meselesi.  - 1 Gurluş ulgamyny, dilini, “SpringBoot” wersiýasyny, artifakt sazlamalaryny, Java wersiýasyny we garaşlylyklaryny saýlap bilersiňiz. Baglylyk goşmak düwmesine bassaňyz, gözleg paneli bilen häsiýetli menýu dörediler. Dynç we maglumatlar sözlerine ilkinji dalaşgärler Bahar web we bahar maglumatlary - biz olary goşarys. “Lombok” amatly kitaphana bolup, getter we kesgitleýiş usullary bilen kilometrlik koddan dynmak üçin bellikleri ulanmaga mümkinçilik berýär. “Döret” düwmesine basmak bilen, eýýäm açylan we halaýan IDE-de açylyp bilinjek taslama bilen arhiw alarys. Düzgüne görä, gurluşyk ulgamy üçin konfigurasiýa faýly bolan boş taslama alarys (meniň pikirimçe bu ýuwaş-ýuwaşdan bolar, ýöne Maven bilen hiç hili tapawut ýok we bir bahar başlangyç faýly) REST API ýa-da başga bir synag meselesi.  - 2 Ünsli adamlar iki zada üns berip bilerler . Ilki bilen, programma.properties we application.yml atly iki sazlama faýly bar. Düzgüne görä, takyk häsiýetlere eýe bolarsyňyz - sazlamalary saklap boljak boş faýl, ýöne maňa yml formaty birneme okalýan ýaly görünýär, indi deňeşdirme görkezerin: REST API ýa-da başga bir synag meselesi.  - 3 Çep tarapdaky surat has ykjam görünse-de , häsiýetler ýolunda köp mukdarda köpeltmäni görmek aňsat. Sag tarapdaky surat, okamak aňsat bolan agaç gurluşy bolan adaty yml faýly. Bu faýly soňrak taslamada ulanaryn. Üns berýän adamlaryň görüp biljek ikinji zady, taslamamda eýýäm birnäçe paket bar. Ol ýerde entek akylly kod ýok, ýöne şolardan geçmeli. Programma nähili ýazylýar? Belli bir meselä eýe bolmak bilen, ony dargatmalydyrys - kiçijik kiçi böleklere bölüp, yzygiderli durmuşa geçirip başlamaly. Bizden näme talap edilýär? Müşderiniň ulanyp biljek API-sini üpjün etmeli, dolandyryjy bukjanyň mazmuny funksiýanyň bu bölegi üçin jogapkärçilik çeker. Programmanyň ikinji bölümi maglumatlar bazasy - tutanýerlilik bukjasydyr. Onda maglumatlar bazasy guramalary (kärhanalar), şeýle hem ammarlar - maglumatlar bazasy bilen aragatnaşyk saklamaga mümkinçilik berýän ýörite bahar interfeýsleri ýaly zatlary saklarys. Hyzmat bukjasynda hyzmat sapaklary bolar. Aşakda Bahar görnüşli Hyzmatyň nämedigi hakda gürleşeris. Iň soňkusy, gap-gaçlar bukjasy. Her dürli kömekçi usullary bolan peýdaly synplar şol ýerde saklanar, mysal üçin, sene we wagt bilen işlemek üçin sapaklar, ýa-da setirler bilen işlemek üçin sapaklar we başga näme bilýär. Funksiýanyň birinji bölümini durmuşa geçirip başlalyň. III bölüm: Dolandyryjy
@RestController
@RequestMapping("${application.endpoint.root}")
@RequiredArgsConstructor
public class EmployeeController {

    private final EmployeeService employeeService;

    @GetMapping("${application.endpoint.employee}")
    public ResponseEntity<List<Employee>> getEmployees() {
        return ResponseEntity.ok().body(employeeService.getAllEmployees());
    }
}
Indi “EmployeeController” synpymyz şuňa meňzeýär. Bu ýerde üns bermäge mynasyp birnäçe möhüm zatlar bar. 1. Sapagyň üstündäki bellikler, ilkinji @RestController programmamyza bu synpyň ahyrky nokady boljakdygyny aýdýar. 2. @RequestMapping, hökmany bolmasa-da, peýdaly düşündiriş, ahyrky nokat üçin belli bir ýol kesgitlemäge mümkinçilik berýär. Bular. kakmak üçin ýerlihost: port / işgäri däl-de, bu ýagdaýda ýerlihost: 8086 / api / v1 / işgäri haýyşlary ibermeli bolarsyňyz Aslynda bu api / v1 we işgär nireden geldi? Application.yml programmamyzdan ýakyndan göz aýlasaňyz, aşakdaky setirleri tapyp bilersiňiz:
application:
  endpoint:
    root: api/v1
    employee: employee
    task: task
Görşüňiz ýaly, bizde application.endpoint.root we application.endpoint.employee ýaly üýtgeýjiler bar, bular belliklerde ýazan zatlarym, bu usuly ýatda saklamagy maslahat berýärin - giňeltmek ýa-da gaýtadan ýazmak üçin köp wagt tygşytlar işleýşi - konfigurasiýada hemme zadyň bolmagy elmydama has amatly we tutuş taslamany gaty kodlamaz. 3. @RequiredArgsConstructor, Lombok düşündirişidir, gereksiz zatlar ýazmazlyk üçin amatly kitaphanadyr. Bu ýagdaýda düşündiriş, synpyň jemleýji hökmünde bellenen ähli meýdanlary bolan jemgyýetçilik konstruktorynyň boljakdygyna deňdir
public EmployeeController(EmployeeService employeeService) {
    this.employeeService=employeeService;
}
Oneöne bir düşündiriş ýeterlik bolsa, näme üçin beýle zat ýazmaly? :) theeri gelende aýtsak, gutlaýarys, bu iň soňky jemleýji meýdan, belli bir baglylyk sanjymyndan başga zat däl. Geliň, aslynda, “ServiceService” haýsy ugur? Bu, ahyrky nokady üçin haýyşlary gaýtadan işleýän taslamamyzdaky hyzmatlaryň biri bolar. Bu ýerdäki pikir gaty ýönekeý. Her synpyň öz wezipesi bolmaly we gereksiz hereketler bilen ýüklenmeli däldir. Bu gözegçilik ediji bolsa, haýyşlary kabul etmek we jogap ibermek barada alada etsin, ýöne işlemegi goşmaça hyzmata tabşyrarys. Bu synpda galan iň soňky zat, ýokarda agzalan hyzmaty ulanyp kompaniýamyzyň ähli işgärleriniň sanawyny yzyna gaýtaryp berýän ýeke-täk usuldyr. Sanawyň özi “ResponseEntity” atly bir gurama gurşalandyr. Geljekde, zerur bolsa, awtomatlaşdyrylan ulgamyň düşünip biljek jogap koduny we habary aňsatlyk bilen yzyna gaýtaryp bermek üçin edýärin. Şeýlelikde, meselem, ResponseEntity.ok () hemme zadyň gowydygyny aýdýan 200-nji kody yzyna gaýtaryp berer, ýöne gaýdyp gelsem, mysal üçin
return ResponseEntity.badRequest().body(Collections.emptyList());
şonda müşderi 400 kody alar - erbet reuqest we jogapda boş sanaw. Adatça haýyş nädogry bolsa bu kod yzyna gaýtarylýar. Emma programmany başlamak üçin bir gözegçilik ediji ýeterlik bolmaz. Biziň garaşlylygymyz muny etmäge mümkinçilik bermez, sebäbi henizem bazamyz bolmaly :) Bolýar, indiki bölüme geçeliň. IV bölüm: ýönekeý tutanýerlilik Esasy wezipämiz programmany işe girizmek bolansoň, häzirlikçe özümizi birnäçe stub bilen çäklendireris. Dolandyryjy synpynda “Işgär” görnüşli obýektleriň sanawyny yzyna gaýtaryp berýändigimizi eýýäm gördüňiz, bu maglumatlar bazasy üçin biziň guramamyz bolar. Geliň, ony demo.persistence.entity paketinde döredeliň . Geljekde guramanyň bukjasyny maglumatlar bazasyndaky beýleki guramalar bilen dolduryp bolar.
@Entity
@Data
@Accessors(chain = true)
public class Employee {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    Long id;
}
Bu, gapy ýaly ýönekeý synp, Annotasiýalarynda aşakdakylar aýdylýar: bu maglumatlar bazasy @Entity, bu @Data - Lombok maglumatlary bolan synp. Peýdaly “Lombok” biziň üçin ähli zerur zatlary, sazlaýjylary, konstruktorlary - doly zatlary döreder. Tortuň üstünde azajyk alça @Accessors (zynjyr = dogry) Aslynda bu, Gurluşykçy nagşynyň gizlin durmuşa geçirilmegi. Konstruktoryň üsti bilen däl-de, usullar bilen bellemek isleýän bir topar meýdanyňyz bar diýeliň. Dürli tertipde, belki hemmesi bir wagtda däl. Arzaňyzda haýsy logika boljakdygyny hiç wagt bilmersiňiz. Bu düşündiriş bu meseläniň açarydyr. Geliň seredeliň:
public Employee createEmployee() {
    return new Employee().setName("Peter")
        				.setAge("28")
        				.setDepartment("IT");
}
Synpymyzda bu meýdanlaryň hemmesiniň bardygyny kabul edeliň - Siz olary belläp bilersiňiz, belläp bilmersiňiz, ýerlerde garyşdyryp bilersiňiz. Diňe 3 häsiýet bar bolsa, bu ajaýyp bir zat ýaly däl. Propertiesöne has köp sanly häsiýetli synplar bar, meselem 50. We şuňa meňzeş bir zat ýazyň
public Employee createEmployee() {
    return new Employee("Peter", "28", "IT", "single", "loyal", List.of(new Task("do Something 1"), new Task ("do Something 2")));
}
Gaty owadan görünmeýär, şeýlemi? Şeýle hem, konstruktora laýyklykda üýtgeýänleri goşmak tertibini berk berjaý etmeli. Şeýle-de bolsa, geliň, meselä gaýdyp geleliň. Indi bizde bir (hökmany) meýdan bar - özboluşly kesgitleýji. Bu ýagdaýda, maglumatlar bazasyna ýazylanda awtomatiki usulda döredilýän Uzyn görnüşli san. Şoňa laýyklykda @Id düşündirişi munuň özboluşly kesgitleýjidigini aýdyň görkezýär; @GeneratedValue özboluşly nesli üçin jogapkärdir. @Id-iň awtomatiki usulda döredilmeýän meýdanlara goşulyp biljekdigini bellemelidiris, ýöne soň özboluşlylyk meselesini el bilen çözmeli bolar. Işgärleriň özboluşly kesgitleýjisi näme bolup biler? Mysal üçin, doly at + bölüm ... ýöne, adamyň doly atlary bar we şol bir bölümde işlemäge mümkinçiligi bar, kiçijik, ýöne bar - bu kararyň erbetdigini aňladýar. Iş hakynyň senesi, şäher ýaly başga bir topar meýdan goşmak mümkin, ýöne bularyň hemmesi, meniň pikirimçe, logikany gaty çylşyrymlaşdyrýar. Bir topar meýdanlaryň birbada özboluşly bolmagy nädip mümkin? Men jogap berýärin - belki. Bilesigelijilik bilen gyzyklanýan bolsaňyz, @Embeddable we @Embedded ýaly bir zat hakda google edip bilersiňiz, biz düýp manysyny ýerine ýetirdik. Indi bize ýönekeý ammar gerek. Bu şeýle bolar:
public interface EmployeeRepository extends JpaRepository<Employee, Long> {

}
Hawa, bularyň hemmesi. Diňe bir interfeýs, oňa “EmployeeRepository” diýdik, iki görnüşli parametrli JpaRepository giňeldýär, birinjisi işleýän maglumat görnüşine jogap berýär, ikinjisi açar görnüşi üçin. Biziň ýagdaýymyzda bular Işgär we Uzyn. Häzirlikçe ýeterlik. Programmany işe girizmezden ozal iň soňky degishme biziň hyzmatymyz bolar:
@Service
@RequiredArgsConstructor
public class EmployeeService {

    private final EmployeeRepository employeeRepository;

    public List<Employee> getAllEmployees() {
        return List.of(new Employee().setId(123L));
    }
}
Öňden tanyş “RequiredArgsConstructor” we täze @Service düşündiriş bar - bu, adatça, iş logika gatlagyny aňladýar. Bahar konteksti işledilende, bu düşündiriş bilen bellenen sapaklar noýba hökmünde dörediler. “EmployeeController” synpynda iň soňky emläk “EmployeeService” -ni döretdik we “RequiredArgsConstructor” (ýa-da el bilen konstruktor ýasadyk) Bahary goşduk, programma başlanda bu ýeri tapar we bize bu üýtgeýjä synp obýektini berer. Bu ýerde deslapky görnüş Singleton - ýagny şeýle baglanyşyklaryň hemmesi üçin bir obýekt bolar; programma düzülende göz öňünde tutulmalydyr. Aslynda, bularyň hemmesi, programma işe girizilip bilner. Sazlama zerur sazlamalary girizmegi ýatdan çykarmaň. REST API ýa-da başga bir synag meselesi.  - 4 Maglumatlar bazasyny nädip gurmalydygyny, ulanyjyny we maglumatlar binýadyny nädip döretmelidigini düşündirip bilmerin, ýöne URL-de iki sany goşmaça parametr ulanýandygymy bellärin - useUnicore = true we characterEncoding = UTF-8. Bu, tekstiň islendik ulgamda deň derejede görkezilmegi üçin edildi. Şeýle-de bolsa, maglumat bazasy bilen gyzyklanmakdan gaty ýalta bolsaňyz we hakykatdanam iş koduny öwrenmek isleseňiz, çalt çözgüt bar: 1. build.gradle üçin aşakdaky garaşlylygy goşuň:
implementation 'com.h2database:h2:2.1.214'
2. Application.yml-da birnäçe häsiýeti redaktirlemeli, ýönekeýlik üçin bahar bölüminiň doly mysalyny bererin:
spring:
  application:
    name: "employee-management-service"
  jpa:
    show-sql: true
    hibernate:
      ddl-auto: update
    database-platform: org.hibernate.dialect.H2Dialect
  datasource:
    driver-class-name: org.h2.Driver
    url: jdbc:h2:file:./mydb
    username: sa
    password:
Maglumat bazasy taslama bukjasynda, mydb atly faýlda saklanar . Aöne doly hukukly maglumat bazasyny gurmagy maslahat bererin the Mowzukda peýdaly makala: H2 maglumat bazasy bilen bahar aýakgaby Diňe şeýle bolan ýagdaýynda, garaşlylykdaky gapma-garşylyklary aradan aýyrmak üçin build.gradle-iň doly görnüşini hödürlärin:
plugins {
	id 'org.springframework.boot' version '2.7.2'
	id 'io.spring.dependency-management' version '1.0.12.RELEASE'
	id 'java'
}

group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '17'

configurations {
	compileOnly {
		extendsFrom annotationProcessor
	}
}

repositories {
	mavenCentral()
}

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
	implementation 'org.springframework.boot:spring-boot-starter-web'
	implementation 'mysql:mysql-connector-java:8.0.30'
	compileOnly 'org.projectlombok:lombok'
	annotationProcessor 'org.projectlombok:lombok'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

tasks.named('test') {
	useJUnitPlatform()
}
Ulgam işe girizmäge taýyn: REST API ýa-da başga bir synag meselesi.  - 5 Islendik amatly programmadan GET haýyşyny ahyrky nokadymyza iberip, barlap bilersiňiz. Bu aýratyn ýagdaýda yzygiderli brauzer eder, ýöne geljekde bize Poçta gerek bolar. REST API or очередное тестовое задание. - 6 Hawa, aslynda biz entek hiç hili iş talaplaryny durmuşa geçirmedik, ýöne eýýäm başlaýan we zerur funksiýa çenli giňeldilip bilinjek programma bar. Dowamy: REST API we maglumatlary barlamak
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION