JavaRush /Блоги Java /Random-TG /REST API ва дигар вазифаи санҷишӣ.
Денис
Сатҳи
Киев

REST API ва дигар вазифаи санҷишӣ.

Дар гурӯҳ нашр шудааст
Қисми I: Оғоз Аз куҷо бояд оғоз кард? Аҷиб, аммо аз хусусиятҳои техникӣ. Боварӣ ҳосил кардан хеле муҳим аст, ки пас аз хондани TOR-и пешниҳодшуда шумо пурра дарк мекунед, ки дар он чӣ навишта шудааст ва муштарӣ чиро интизор аст. Якум, ин барои татбиқи минбаъда муҳим аст ва дуюм, агар шумо он чизеро, ки аз шумо интизор аст, амалӣ накунед, ин ба фоидаи шумо нахоҳад буд. Барои роҳ надодан ба талафи ҳаво, биёед як тавсифи оддии техникиро нақл кунем. Ҳамин тавр, ман хидмате мехоҳам, ки ман ба он маълумот фиристам, он дар хидмат нигоҳ дошта мешавад ва мувофиқи хоҳиш ба ман баргардонида мешавад. Ман инчунин бояд дар ҳолати зарурӣ ин маълумотро навсозӣ ва нест кунам . Якчанд ҷумла як чизи равшан ба назар намерасад, дуруст? Чӣ тавр ман мехоҳам маълумотро ба он ҷо фиристам? Кадом технологияҳоро истифода бурдан мумкин аст? Ин маълумот дар кадом формат хоҳад буд? Инчунин намунаҳои маълумотҳои воридотӣ ва содиротӣ вуҷуд надоранд. Хулоса - мушаххасоти техникӣ аллакай бад аст . Биёед кӯшиш кунем, ки ибораи дигарро баён кунем: Мо ба хидмате ниёз дорем, ки метавонад дархостҳои HTTP-ро коркард кунад ва бо маълумоти интиқолшуда кор кунад. Ин махзани баҳисобгирии кадрҳо хоҳад буд. Мо коргарон хохем дошт, онхо аз руи шуъбахо ва ихтисосхо таксим карда шудаанд, коргарон шояд вазифахоеро, ки ба зиммаашон гузошта шудаанд. Вазифаи мо автоматикунонии раванди баҳисобгирии кормандони кирошуда, аз кор озодшуда, интиқолшуда, инчунин раванди таъин ва бекор кардани вазифаҳо бо истифода аз REST API мебошад. Ҳамчун марҳилаи 1, мо ҳоло танҳо бо кормандон кор мекунем. Хидмат барои кор бо он бояд якчанд нуқтаи ниҳоӣ дошта бошад: - POST /корманд - дархости POST, ки бояд an objectи JSON-ро бо маълумот дар бораи корманд қабул кунад. Ин an object бояд дар базаи маълумот захира карда шавад; агар чунин an object аллакай дар базаи маълумот мавҷуд бошад, маълумот дар майдонҳо бояд бо маълумоти нав нав карда шавад. - GET /корманд - Гирифтани дархост, ки тамоми рӯйхати кормандони дар базаи маълумот захирашударо бармегардонад - НАЗОР КУНЕД - НАЗОР КУНЕД /корманд барои нест кардани корманди мушаххас Модели маълумот оид ба корманд:
{
  "firstName": String,
  "lastName": String,
  "department": String,
  "salary": String
  "hired": String //"yyyy-mm-dd"
  "tasks": [
  	//List of tasks, not needed for Phase 1
  ]
}
Қисми II: Асбобҳо барои кор Пас, доираи кор каму беш равшан аст, аммо мо онро чӣ гуна иҷро мекунем? Аён аст, ки чунин вазифаҳо дар санҷиш бо якчанд ҳадафҳои барномавӣ дода мешаванд, то бубинанд, ки чӣ тавр шумо рамзгузорӣ мекунед, шуморо маҷбур мекунанд, ки баҳорро истифода баред ва каме бо пойгоҳи додаҳо кор кунед. Хуб, биёед ин корро кунем. Мо ба лоиҳаи SpringBoot бо дастгирии REST API ва базаи маълумот ниёз дорем. Дар вебсайти https://start.spring.io/ шумо метавонед ҳама чизеро, ки ба шумо лозим аст, пайдо кунед. REST API ё дигар вазифаи санҷишӣ.  - 1 Шумо метавонед системаи сохта, забон, versionи SpringBoot-ро интихоб кунед, танзимоти артефакт, versionи Java ва вобастагиҳоро танзим кунед. Бо пахш кардани тугмаи Иловаи вобастагӣ менюи хос бо сатри ҷустуҷӯ пайдо мешавад. Номзадҳои аввалини калимаҳои истироҳат ва додаҳо инҳоянд Spring Web ва Spring Data - мо онҳоро илова хоҳем кард. Lombok як китобхонаи қулай аст, ки ба шумо имкон медиҳад эзоҳҳоро истифода баред, то аз километрҳои code бо усулҳои гетер ва танзимкунанда халос шавед. Бо пахш кардани тугмаи тавлид мо бойгониеро бо лоиҳа мегирем, ки онро аллакай дар IDE дӯстдоштаи мо кушода ва кушодан мумкин аст. Бо нобаёнӣ, мо як лоиҳаи холӣ мегирем, бо файли конфигуратсияи системаи сохтмон (дар ҳолати ман он gradle хоҳад буд, аммо бо Maven чизҳо фарқияти асосӣ надоранд ва як файли оғози баҳор) REST API ё дигар вазифаи санҷишӣ.  - 2 Одамони бодиққат метавонанд ба ду чиз таваҷҷӯҳ кунанд. . Аввалан, ман ду файли танзимоти application.properties ва application.yml дорам. Бо нобаёнӣ, шумо маҳз хосиятҳоро мегиред - файли холӣ, ки дар он шумо метавонед танзимотро нигоҳ доред, аммо ба назари ман формати yml каме хондантар менамояд, ҳоло ман муқоисаро нишон медиҳам: REST API ё дигар вазифаи санҷишӣ.  - 3 Сарфи назар аз он ки расм дар тарафи чап зичтар аст. , дидани миқдори зиёди такрорӣ дар роҳи хосиятҳо осон аст. Тасвир дар тарафи рост як файли муқаррарии yml бо сохтори дарахт аст, ки хондан хеле осон аст. Ман ин файлро дертар дар лоиҳа истифода хоҳам кард. Чизи дуюме, ки одамони бодиққат метавонанд пайхас кунанд, ин аст, ки лоиҳаи ман аллакай якчанд баста дорад. Дар он ҷо ҳоло ягон рамзи солим вуҷуд надорад, аммо аз онҳо гузаштан меарзад. Ариза чӣ гуна навишта мешавад? Бо доштани вазифаи мушаххас, мо бояд онро тақсим кунем - онро ба зервазифаҳои хурд тақсим кунем ва ба иҷрои пайвастаи онҳо шурӯъ кунем. Аз мо чӣ талаб карда мешавад? Мо бояд APIеро пешниҳод кунем, ки муштарӣ метавонад истифода барад; мундариҷаи бастаи контроллер барои ин қисми функсия масъул хоҳад буд. Қисми дуюми барнома пойгоҳи додаҳо - бастаи устуворӣ мебошад. Дар он мо чизҳоеро, аз қабor Объектҳои пойгоҳи додаҳо (an objectҳо) ва инчунин анборҳо - интерфейсҳои махсуси баҳорӣ, ки ба шумо имкон медиҳанд, ки бо пойгоҳи додаҳо ҳамкорӣ кунед, нигоҳ медорем. Маҷмӯи хидматҳо синфҳои хидматрасониро дар бар мегирад. Мо дар бораи он чӣ гуна хидмати навъи баҳор дар поён сӯҳбат хоҳем кард. Ва дар охир, аммо на камтар аз он, бастаи utils. Дар он ҷо синфҳои утorтарӣ бо ҳама гуна усулҳои ёрирасон нигоҳ дошта мешаванд, масалан, дарсҳо барои кор бо сана ва вақт ё синфҳо барои кор бо сатр ва кӣ медонад, ки боз чӣ. Биёед ба татбиқи қисми якуми функсия оғоз кунем. Қисми III: Назоратчӣ
@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());
    }
}
Ҳоло синфи EmployeeController мо чунин менамояд. Дар ин ҷо як қатор чизҳои муҳиме ҳастанд, ки ба онҳо диққат додан лозим аст. 1. Эзоҳҳо дар болои синф, аввалин @RestController ба замимаи мо мегӯяд, ки ин синф нуқтаи ниҳоӣ хоҳад буд. 2. @RequestMapping, гарчанде ҳатмӣ набошад ҳам, тавзеҳи муфид аст; он ба шумо имкон медиҳад, ки роҳи мушаххасро барои нуқтаи ниҳоӣ таъин кунед. Онхое. Барои он ки онро бикӯбад, ба шумо лозим меояд, ки дархостҳоро на ба localhost: port/employee, балки дар ин ҳолат ба localhost:8086/api/v1/employee фиристед Дар асл, ин api/v1 ва корманд аз куҷо пайдо шуданд? Аз application.yml мо Агар шумо бодиққат назар кунед, шумо метавонед сатрҳои зеринро дар он ҷо пайдо кунед:
application:
  endpoint:
    root: api/v1
    employee: employee
    task: task
Тавре ки шумо мебинед, мо чунин тағирёбандаҳо дорем, ба монанди application.endpoint.root ва application.endpoint.employee, ин маҳз ҳамон чизест, ки ман дар шарҳҳо навиштаам, ман тавсия медиҳам, ки ин усулро дар хотир нигоҳ доред - он барои васеъ кардан ё аз нав навиштан вақти зиёдро сарфа мекунад. функсионалӣ - он ҳамеша қулайтар аст, ки ҳама чиз дар конфигуратсия мавҷуд бошад, на тамоми лоиҳаро рамзгузорӣ кунед. 3. @RequiredArgsConstructor як тавзеҳи Lombok аст, китобхонаи қулай, ки ба шумо имкон медиҳад, ки аз навиштани чизҳои нолозим худдорӣ кунед. Дар ин ҳолат, эзоҳ ба он баробар аст, ки синф як конструктори оммавӣ дорад, ки ҳамаи майдонҳо ҳамчун ниҳоӣ қайд карда шудаанд.
public EmployeeController(EmployeeService employeeService) {
    this.employeeService=employeeService;
}
Аммо чаро мо бояд чунин чизе нависем, агар як шарҳ басанда бошад? :) Дар омади гап, табрик мекунам, ин майдони ниҳоии хусусӣ чизе беш аз тазриқи маъруфи вобастагӣ нест. Биёед пеш равем, воқеан, коргари хизматрасонӣ кадом соҳа аст? Ин яке аз хидматҳои лоиҳаи мо хоҳад буд, ки дархостҳоро барои ин нуқтаи ниҳоӣ коркард мекунад. Идеяи ин ҷо хеле содда аст. Ҳар як синф бояд вазифаи худро дошта бошад ва набояд бо амалҳои нолозим пур карда шавад. Агар ин назоратчӣ бошад, бигзор он дар бораи қабули дархостҳо ва ирсоли посухҳо ғамхорӣ кунад, аммо мо беҳтар мехоҳем коркардро ба хидмати иловагӣ супорем. Охирин чизе, ки дар ин синф боқӣ мондааст, ягона усулест, ки рӯйхати ҳамаи кормандони ширкати моро бо истифода аз хидмати дар боло зикршуда бармегардонад. Худи рӯйхат дар як an object бо номи ResponseEntity печонида шудааст. Ман инро барои он мекунам, ки дар оянда, агар лозим шавад, ман ба осонӣ codeи ҷавоб ва паёми ба ман лозимро баргардонам, ки системаи автоматиконидашуда онро дарк кунад. Ҳамин тавр, масалан, ResponseEntity.ok() рамзи 200-умро бармегардонад, ки мегӯяд, ки ҳама чиз хуб аст, аммо агар ман баргардам, масалан
return ResponseEntity.badRequest().body(Collections.emptyList());
он гоҳ муштарӣ рамзи 400 - bad reuqest ва рӯйхати холӣ дар посух мегирад. Одатан, ин рамз баргардонида мешавад, агар дархост нодуруст бошад. Аммо барои оғоз кардани барнома як контроллер кофӣ нахоҳад буд. Вобастагии мо ба мо имкон намедиҳад, ки ин корро кунем, зеро мо ҳанӯз бояд пойгоҳ дошта бошем :) Хуб, биёед ба қисми дигар мегузарем. Қисми IV: устувории оддӣ Азбаски вазифаи асосии мо оғоз кардани барнома аст, мо ҳоло худро бо якчанд нотаҳо маҳдуд мекунем. Шумо аллакай дар синфи Controller дидед, ки мо рӯйхати an objectҳои навъи Employeeро бармегардонем, ин an objectи мо барои пойгоҳи додаҳо хоҳад буд. Биёед онро дар бастаи demo.persistence.entity эҷод кунем.Дар оянда бастаи an object метавонад бо дигар an objectҳо аз пойгоҳи додаҳо илова карда шавад.
@Entity
@Data
@Accessors(chain = true)
public class Employee {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    Long id;
}
Ин як синф ба мисли дар аст, ки эзоҳҳои он маҳз чунин мегӯянд: ин як пойгоҳи додаҳо @Entity аст, ин синф бо додаҳои @Data - Lombok аст. Ломбоки муфид барои мо тамоми гетерҳо, сетерҳо, конструкторҳои заруриро фароҳам меорад - пуркунии пурра. Хуб, каме гелос дар торт @Accessors (занҷир = ҳақиқӣ) аст , дар асл, ин татбиқи пинҳонии намунаи Builder аст. Фарз мекунем, ки шумо як синф бо як қатор майдонҳо доред, ки шумо мехоҳед онро на тавассути созанда, балки бо усулҳо таъин кунед. Бо тартиби гуногун, шояд на ҳама дар як вақт. Шумо ҳеҷ гоҳ намедонед, ки дар аризаи шумо чӣ гуна мантиқ хоҳад буд. Ин эзоҳ калиди шумо барои ин вазифа аст. Биёед бубинем:
public Employee createEmployee() {
    return new Employee().setName("Peter")
        				.setAge("28")
        				.setDepartment("IT");
}
Фарз мекунем, ки мо ҳама ин майдонҳоро дар синфи худ дорем😄Шумо метавонед онҳоро таъин кунед, таъин карда наметавонед, метавонед онҳоро дар ҷойҳо омехта кунед. Дар сурати танҳо 3 моликият, ин чизи аҷибе ба назар намерасад. Аммо синфҳое ҳастанд, ки шумораи зиёди хосиятҳо доранд, масалан 50. Ва чизе монанди нависед
public Employee createEmployee() {
    return new Employee("Peter", "28", "IT", "single", "loyal", List.of(new Task("do Something 1"), new Task ("do Something 2")));
}
На он қадар зебо ба назар мерасад, ҳамин тавр? Мо инчунин бояд тартиби илова кардани тағирёбандаҳоро мувофиқи конструктор ба таври қатъӣ риоя кунем. Бо вуҷуди ин, ман саркашӣ мекунам, биёед ба матлаб бармегардем. Ҳоло мо дар он як майдон (ҳатмӣ) дорем - идентификатори беназир. Дар ин ҳолат, ин рақами навъи дароз аст, ки ҳангоми захира кардан дар базаи маълумот ба таври худкор тавлид мешавад. Мувофиқи ин, шарҳи @Id ба мо равшан нишон медиҳад, ки ин идентификатори беназир аст; @GeneratedValue барои насли беназири он масъул аст. Бояд қайд кард, ки @Id-ро ба майдонҳое, ки ба таври худкор тавлид намешаванд, илова кардан мумкин аст, аммо баъд масъалаи нотакрорро дастӣ ҳал кардан лозим меояд. Муайянкунандаи беназири корманд чӣ буда метавонад? Хуб, масалан, ному насаби пурра + шӯъба... бо вуҷуди ин, шахс ному насаби комил дорад ва имкон дорад, ки онҳо дар як шӯъба кор кунанд, хурд, аммо вуҷуд дорад - ин маънои онро дорад, ки қарор бад аст. Мумкин буд, ки як қатор соҳаҳои дигарро, аз қабor санаи кироя, шаҳр илова кард, аммо ҳамаи ин, ба назарам, мантиқро аз ҳад зиёд мушкил мекунад. Шояд шумо ҳайрон шавед, ки чӣ тавр ҳатто як қатор майдонҳо якбора беназир шудан мумкин аст? Ман ҷавоб медиҳам - шояд. Агар шумо кунҷкоб бошед, шумо метавонед дар бораи чунин чизе ба монанди @Embeddable ва @Embedded дар Google ҷустуҷӯ кунед, мо бо моҳият тамом шудем. Ҳоло ба мо як анбори оддӣ лозим аст. Ин чунин хоҳад буд:
public interface EmployeeRepository extends JpaRepository<Employee, Long> {

}
Бале, тамом. Танҳо интерфейс, ки мо онро EmployeeRepository номидем, он JpaRepository-ро васеъ мекунад, ки дорои ду параметри чопшуда мебошад, якум барои навъи маълумоте, ки бо он кор мекунад, дуюмӣ барои навъи калид масъул аст. Дар ҳолати мо, инҳо Корманд ва Лонг мебошанд. Ҳоло ҳамин кифоя аст. Дастрасии ниҳоӣ пеш аз оғози барнома хидмати мо хоҳад буд:
@Service
@RequiredArgsConstructor
public class EmployeeService {

    private final EmployeeRepository employeeRepository;

    public List<Employee> getAllEmployees() {
        return List.of(new Employee().setId(123L));
    }
}
RequiredArgsConstructor аллакай шинос ва шарҳи нави @Service мавҷуд аст - ин одатан қабати мантиқии тиҷоратро ифода мекунад. Ҳангоми иҷро кардани контексти баҳор, синфҳои бо ин эзоҳ ишорашуда ҳамчун Beans эҷод карда мешаванд. Вақте ки дар синфи EmployeeController мо хосияти ниҳоии EmployeeService офаридем ва RequiredArgsConstructor-ро замима кардем (ё созандаи дастӣ) Spring, ҳангоми оғоз кардани барнома, он ин ҷойро пайдо мекунад ва ба мо an objectи синфро ба ин тағирёбанда мегузорад. Пешфарз дар ин ҷо Singleton аст - яъне. барои ҳамаи ин гуна истинодҳо як an object мавҷуд хоҳад буд; ин муҳим аст, ки ҳангоми тарҳрезии барнома ба назар гирифта шавад. Дар асл, ин ҳама аст, барномаро оғоз кардан мумкин аст. Фаромӯш накунед, ки танзимоти заруриро дар конфигуратсия ворид кунед. REST API ё дигар вазифаи санҷишӣ.  - 4 Ман чӣ гуна насб кардани пойгоҳи додаҳо, эҷод кардани корбар ва худи базаро тавсиф намекунам, аммо ман танҳо қайд мекунам, ки дар URL ман ду параметри иловагиро истифода мебарам - useUnicore=true ва characterEncoding=UTF-8. Ин барои он анҷом дода шуд, ки матн дар ҳама гуна система кам ё камтар баробар намоиш дода шавад. Аммо, агар шумо барои кор кардан бо пойгоҳи додаҳо хеле танбал бошед ва воқеан мехоҳед, ки рамзи кориро пайгирӣ кунед, роҳи ҳалли зуд вуҷуд дорад: 1. Вобастагии зеринро ба build.gradle илова кунед:
implementation 'com.h2database:h2:2.1.214'
2. Дар application.yml шумо бояд якчанд хосиятҳоро таҳрир кунед, ман барои соддагӣ намунаи пурраи фасли баҳор медиҳам:
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:
Пойгоҳи додаҳо дар папкаи лоиҳа дар файле бо номи mydb нигоҳ дошта мешавад . Аммо ман тавсия медиҳам, ки пойгоҳи додаҳои мукаммал насб кунед 😉 Мақолаи муфид дар мавзӯъ: Баҳор Boot бо пойгоҳи додаҳои H2 Ба ҳар ҳол, ман versionи пурраи build.gradle-и худро барои бартараф кардани ихтилофот дар вобастагӣ пешниҳод мекунам:
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()
}
Система барои оғозёбӣ омода аст: REST API ё дигар вазифаи санҷишӣ.  - 5 Шумо метавонед онро тавассути фиристодани дархости GET аз ҳама гуна барномаи мувофиқ ба нуқтаи ниҳоии мо тафтиш кунед. Дар ин ҳолат, браузери муқаррарӣ кор хоҳад кард, аммо дар оянда ба мо Postman лозим мешавад. REST API or очередное тестовое задание. - 6 Бале, дар асл, мо то ҳол ягон талаботи тиҷоратро иҷро накардаем, аммо мо аллакай барномае дорем, ки оғоз меёбад ва метавонад ба функсияҳои зарурӣ васеъ карда шавад. Идома: REST API ва Санҷиши маълумот
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION