рдЦреБрд▓рд╛ рд╕рдмрдХ "рд╡рд╕рдВрдд рдкрд░ рдмрд╛рдХреА рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг"

рдФрд░ рдлрд┐рд░ рд╕реЗ, рдЕрдЪреНрдЫрд╛ рджрд┐рди! рдмрд╣реБрдд рдЬрд▓реНрдж, рд╣рдо рдЕрдЧрд▓реЗ рд╕рдореВрд╣, "рдбреЗрд╡рд▓рдкрд░ рдСрди рдж рд╕реНрдкреНрд░рд┐рдВрдЧ рдлреНрд░реЗрдорд╡рд░реНрдХ" рдХреЗ рд▓рд┐рдП рдкреНрд░рд╢рд┐рдХреНрд╖рдг рд╢реБрд░реВ рдХрд░реЗрдВрдЧреЗ, рдЬрд┐рд╕рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рд╣рдордиреЗ рдПрдХ рдЦреБрд▓рд╛ рд╕рдмрдХ рдЪрд▓рд╛рдпрд╛, рдЬреЛ рдкрд╣рд▓реЗ рд╣реА рд▓реЙрдиреНрдЪ рдХреА рдкреНрд░рддреНрдпрд╛рд╢рд╛ рдореЗрдВ рдПрдХ рдкрд░рдВрдкрд░рд╛ рдмрди рдЧрдИ рд╣реИред рдЗрд╕ рд╡реЗрдмрд┐рдирд╛рд░ рдореЗрдВ, рд╣рдордиреЗ рд╕реНрдкреНрд░рд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ REST рдХреНрд▓рд╛рдЗрдВрдЯ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХреА, рдФрд░ рд╕реНрдкреНрд░рд┐рдВрдЧ рдХреИрд╢, рд╕реНрдкреНрд░рд┐рдВрдЧ рд░рд┐рдЯреНрд░реА рдФрд░ рд╣рд┐рд╕реНрдЯреНрд░рд┐рдХреНрд╕ рдЬреИрд╕реА рддрдХрдиреАрдХреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреА рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╕реАрдЦрд╛ред

рд╡реНрдпрд╛рдЦреНрдпрд╛рддрд╛: рдпреВрд░реА рдбреНрд╡реЛрд░рдЬрд╝реЗрддреНрд╕реНрдХреА - рд▓рдХреНрд╕реЙрдлреНрдЯ рдЯреНрд░реЗрдирд┐рдВрдЧ рд╕реЗрдВрдЯрд░ рдореЗрдВ рдЯреНрд░реЗрдирд░, рдореБрдЦреНрдп рдбреЗрд╡рд▓рдкрд░, рднреМрддрд┐рдХ рдФрд░ рдЧрдгрд┐рддреАрдп рд╡рд┐рдЬреНрдЮрд╛рди рдХреЗ рдЙрдореНрдореАрджрд╡рд╛рд░ред

рд╡реЗрдмрд┐рдирд╛рд░ рдореЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рджрд░реНрд╢рдХреЛрдВ рдиреЗ рднрд╛рдЧ рд▓рд┐рдпрд╛, 10 рдмрд┐рдВрджреБрдУрдВ рдкрд░ 0-6 рдЕрдВрдХреЛрдВ рдХреЗ рднреАрддрд░ рд╕реНрдкреНрд░рд┐рдВрдЧ рдХреЗ рдЕрдкрдиреЗ рдЬреНрдЮрд╛рди рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд┐рдпрд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╕рдореАрдХреНрд╖рд╛рдУрдВ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдЦреБрд▓рд╛ рд╕рдмрдХ рдЕрдиреБрднрд╡реА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рднреА рдЙрдкрдпреЛрдЧреА рд▓рдЧ рд░рд╣рд╛ рдерд╛ред



рд╕реНрдкреНрд░рд┐рдВрдЧ 5 рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рд╢рдмреНрдж

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ, рд╕реНрдкреНрд░рд┐рдВрдЧ рдлреНрд░реЗрдорд╡рд░реНрдХ рдЬрд╛рд╡рд╛ рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рдФрд░ рдХрд╛рдлреА рд▓реЛрдХрдкреНрд░рд┐рдп рдврд╛рдВрдЪрд╛ рд╣реИред рд╡рд╕рдВрдд рдореЗрдВ рдЙрдкрдкреНрд░реЛрдЬреЗрдХреНрдЯ рдпрд╛ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдПрдХ рджреНрд░рд╡реНрдпрдорд╛рди рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рдЖрдкрдХреЛ рдХрдИ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ "рдПрдХ рдврд╛рдВрдЪреЗ рдореЗрдВ рдЪреМрдЦрдЯреЗ" рдХрд╛ рдПрдХ рдмрдбрд╝рд╛ рд╕рдВрдЧреНрд░рд╣ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЙрдирдореЗрдВ рд╕реЗ рдХреБрдЫ:

  • рд╕реНрдкреНрд░рд┐рдВрдЧ рдЖрдИрдУрд╕реА + рдПрдУрдкреА = рд╕рдВрджрд░реНрдн,
  • рд╕реНрдкреНрд░рд┐рдВрдЧ JDBC,
  • рд╕реНрдкреНрд░рд┐рдВрдЧ рдУрдЖрд░рдПрдо,
  • рд╕реНрдкреНрд░рд┐рдВрдЧ рдбреЗрдЯрд╛ (рдпрд╣ рд╕рдмрдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХрд╛ рдПрдХ рдкреВрд░рд╛ рд╕реЗрдЯ рд╣реИ),
  • рд╕реНрдкреНрд░рд┐рдВрдЧ рдПрдорд╡реАрд╕реА, рд╕реНрдкреНрд░рд┐рдВрдЧ рд╡реЗрдмрдлреНрд▓рдХреНрд╕,
  • рд╡рд╕рдВрдд рд╕реБрд░рдХреНрд╖рд╛
  • рд╕реНрдкреНрд░рд┐рдВрдЧ рдХреНрд▓рд╛рдЙрдб (рдпрд╣ рд╕рдмрдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХрд╛ рдФрд░ рднреА рдмрдбрд╝рд╛ рд╕реЗрдЯ рд╣реИ)
  • рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреИрдЪ,
  • рд╡рд╕рдВрдд рдХрд╛ рдмреВрдЯред


рд╕реНрдкреНрд░рд┐рдВрдЧ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреА рдЬрдЧрд╣ рд▓реЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХрднреА-рдХрднреА рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗрд╡рд▓ рдПрдХ рдмреБрд░реЗ рд╕рдкрдиреЗ рдореЗрдВ рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИред рдЙрддреНрдкрд╛рджрди-рдЧреНрд░реЗрдб рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рдЬрд▓реНрджреА рд╕реЗ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╡реЗ рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдПрдХ рд╡рд┐рд╢реЗрд╖ рд░реВрдкрд░реЗрдЦрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╕реНрдЯрд╛рд░реНрдЯрд░реНрд╕ ('рд╕реНрдЯрд╛рд░реНрдЯрд░') рдХрд╛ рдПрдХ рд╕реЗрдЯ рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рд╕реНрдкреНрд░рд┐рдВрдЧ рдлреНрд░реЗрдорд╡рд░реНрдХ рдФрд░ рдЕрдиреНрдп рддрдХрдиреАрдХреЛрдВ рдХреЗ рд╡рд┐рдиреНрдпрд╛рд╕ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рддрд╛ рд╣реИред

рд╕реНрдкреНрд░рд┐рдВрдЧ рдХреА рдХреБрдЫ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЕрд╡рд░реБрджреНрдз рд╕рд╛рдЗрдЯреЛрдВ рдХрд╛ рд╡рд┐рд╖рдп рдПрдХрджрдо рд╕рд╣реА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЕрдм рдлреИрд╢рдиреЗрдмрд▓ рд╣реИ))ред рдпрджрд┐ рдЖрдк рдкрд╛рда рдФрд░ рдЕрднреНрдпрд╛рд╕ рдореЗрдВ рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рднрд╛рдЧ рд▓реЗрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╢рд┐рдХреНрд╖рдХ рдХреЛ рд╕реБрдЭрд╛рдП рдЧрдП рд╕рд░реНрд╡рд░ рдХреЛрдб рдХреЗ рд╕рд╛рде рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХреА рдЬрд╛рддреА рд╣реИред рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ:

git clone git@github.com:ydvorzhetskiy/sb-server.git

рдЕрдЧрд▓рд╛, рдмрд╕ рдЪрд▓рд╛рдПрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕ рддрд░рд╣:

mvnw spring-boot:run

рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреВрдЯ рдХреА рд╕рдмрд╕реЗ рдмрдбрд╝реА рдЙрдкрд▓рдмреНрдзрд┐ IntelliJ IDEA рдореЗрдВ рдХреЗрд╡рд▓ рдореБрдЦреНрдп рд╡рд░реНрдЧ рдХреЛ рдЪрд▓рд╛рдХрд░ рд╕рд░реНрд╡рд░ рдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реИред

BlockedSite.java рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╣рдорд╛рд░рд╛ рд╕реНрд░реЛрдд рдХреЛрдб рд╣реИ:

 package ru.otus.demoserver.domain; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; @Entity public class BlockedSite { @Id @GeneratedValue private int id; private String url; 


рдФрд░ рдпрд╣рд╛рдБ BlockedSitesController.java рдирд┐рдпрдВрддреНрд░рдХ рдХреА рд╕рд╛рдордЧреНрд░реА рд╣реИ:

 package ru.otus.demoserver.rest; @RestController public class BlockedSitesController { private final Logger logger = LoggerFactory.getLogger(BlockedSitesController.class); private final BlockedSitesRepository repository; public BlockedSitesController(BlockedSitesRepository repository) { this.repository = repository; } @GetMapping("/blocked-sites") public List<BlockedSite> blockedSites() { logger.info("Request has been performed"); return repository.findAll(); } } 



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 http://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.1.2.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>ru.otus</groupId> <artifactId>demo-server</artifactId> <version>0.0.1-SNAPSHOT</version> <url>demo-server</url> <description>Demo project for Spring Boot</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-data-jpa</artifactId> </dependency> <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project> 

рдЕрдм, рдПрдХ рд╕рд░рд▓ рдФрд░ рд╕рд░рд▓ рддрд░реАрдХреЗ рд╕реЗ, рд╣рдо рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣рдорд╛рд░реЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рджреЛ рдЕрд╡рд░реБрджреНрдз рд╕рд╛рдЗрдЯреЗрдВ (DemoServerApplication.java) рдмрдЪрд╛рддреЗ рд╣реИрдВ:

 package ru.otus.demoserver; @SpringBootApplication public class DemoServerApplication { public static void main(String[] args) { ApplicationContext ctx = SpringApplication.run(DemoServerApplication.class, args); BlockedSitesRepository repository = ctx.getBean(BlockedSitesRepository.class); repository.save(new BlockedSite("https://telegram.org/")); repository.save(new BlockedSite("https://azure.microsoft.com/")); } } 

рдпрд╣ рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рд░реНрд╡рд░ рдХреЛ рдЪрд╛рд▓реВ рдХрд░рдиреЗ рдФрд░ рд╕реНрдерд╛рдиреАрдп рд╣реЛрд╕реНрдЯ рдкрд░ рдЙрдкрдпреБрдХреНрдд URL рдЦреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд╣реБрдЖ рд╣реИ (localhost:8080/blocked-sites) ред рдЙрд╕реА рд╕рдордп, рд╣рдорд╛рд░рд╛ рд╕рд░реНрд╡рд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЙрди рд╕рд╛рдЗрдЯреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдкрд░ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧрд╛ рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдордиреЗ рдЕрд╡рд░реБрджреНрдз рдХрд┐рдпрд╛ рдерд╛, рдЕрд░реНрдерд╛рддреН, рд╡реЗ рд╕рд╛рдЗрдЯреЗрдВ рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдордиреЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬреЛрдбрд╝рд╛ рдерд╛ред

рдЦреИрд░, рдЗрд╕ рд╕рд░реНрд╡рд░ рдкрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рд▓рд┐рдЦрдиреЗ рдХрд╛ рд╕рдордп рдЖ рдЧрдпрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЗрд╕рд╕реЗ рдЖрдЧреЗ рдмрдврд╝рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЖрдкрдХреЛ рдХреБрдЫ рдпрд╛рдж рд░рдЦрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред

рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рдкреАрдЫреЗ рд╣рдЯрдирд╛

рдЖрдЗрдП рдХреБрдЫ HTTP рддрд░реАрдХреЛрдВ (рдХреНрд░рд┐рдпрд╛рдУрдВ) рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░реЗрдВ:

  • рдкреНрд░рд╛рдкреНрдд - рдПрдХ рдЗрдХрд╛рдИ рдпрд╛ рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛;
  • POST - рдЗрдХрд╛рдИ рдХрд╛ рдирд┐рд░реНрдорд╛рдг;
  • PUT - рдкрд░рд┐рд╡рд░реНрддрди рдЗрдХрд╛рдИ;
  • рдкрде - рдЗрдХрд╛рдИ рдкрд░рд┐рд╡рд░реНрддрди (RFC -...);
  • DELETE - рд╣рдЯрд╛рдПрдВ рдЗрдХрд╛рдИ;
  • рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ HTTP рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдФрд░ REST рд╕реЗрд╡рд╛рдУрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП HEAD, рд╡рд┐рдХрд▓реНрдк - "рдореБрд╢реНрдХрд┐рд▓" рддрд░реАрдХреЗ;
  • TRACE рдПрдХ рдЕрдкреНрд░рдЪрд▓рд┐рдд рд╡рд┐рдзрд┐ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдХреЛрдИ рднреА рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдпрд╛рдж рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рд╕рд░рд▓ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдЖрдк рдХрд┐рддрдиреА рдмрд╛рд░ рдХрд┐рд╕реА рдСрдкрд░реЗрд╢рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдЙрд╕реА рддрд░рд╣ рд╣реЛрдЧрд╛ рдЬреИрд╕реЗ рдЖрдкрдиреЗ рдЗрд╕реЗ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдерд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдкрдиреЗ рд╕реБрдмрд╣ рдПрдХ рдЖрджрдореА рдХреЛ рдирдорд╕реНрддреЗ рдХрд╣рд╛, "рд╣реИрд▓реЛ!" рдирддреАрдЬрддрди, рдЖрдкрдХрд╛ рджреЛрд╕реНрдд "рд╣реИрд▓реЛ" рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЪрд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ :-)ред рдФрд░ рдЕрдЧрд░ рдЖрдк рдХрд╣рддреЗ рд╣реИрдВ "рд╣реИрд▓реЛ!" рджрд┐рди рдореЗрдВ рдХрдИ рдмрд╛рд░ рдЙрд╕рдХреЗ рд▓рд┐рдП, рдХреБрдЫ рднреА рдирд╣реАрдВ рдмрджрд▓реЗрдЧрд╛, рд╡рд╣ рдЙрд╕реА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд░рд╣реЗрдЧрд╛ред

рдЕрдм, рдЖрдЗрдП рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдХрд┐ рдЙрдкрд░реЛрдХреНрдд HTTP рддрд░реАрдХреЛрдВ рдореЗрдВ рд╕реЗ рдХреМрди рд╕рд╛ рдЖрджрд░реНрд╢ рд╣реИ? рдмреЗрд╢рдХ, рдпрд╣ рд╕рдордЭрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдЖрдк рд╢рдмреНрджрд╛рд░реНрде рдХрд╛ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ, рддреЛ рд╢рд┐рдХреНрд╖рдХ рд╡реАрдбрд┐рдпреЛ рдХреЗ 26 рд╡реЗрдВ рдорд┐рдирдЯ рд╕реЗ рд╢реБрд░реВ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдмрд╛рдд рдХрд░рддрд╛ рд╣реИред

рдмрд╛рдХреА

REST рдирд┐рдпрдВрддреНрд░рдХ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдпрд╣ рдпрд╛рдж рд░рдЦрдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ REST рдХреНрдпрд╛ рд╣реИ:

  • рдЖрд░рдИрдПрд╕рдЯреА - рд░рд┐рдкреНрд░реЗрдЬреЗрдВрдЯреЗрд╢рдирд▓ рд╕реНрдЯреЗрдЯ рдЯреНрд░рд╛рдВрд╕рдлрд░;
  • рдпрд╣ рдПрдХ рд╕реНрдерд╛рдкрддреНрдп рд╢реИрд▓реА рд╣реИ, рдорд╛рдирдХ рдирд╣реАрдВ;
  • рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ-рдкреНрд░рддрд┐рдмрдВрдзреЛрдВ рдХрд╛ рдПрдХ рд╕рдореВрд╣ рд╣реИ;
  • REST рдмрд╣реБрдд рд╕рдордп рдкрд╣рд▓реЗ рдерд╛, рд▓реЗрдХрд┐рди рдпрд╣ рд╢рдмреНрдж рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рд╣рд╛рд▓ рд╣реА рдореЗрдВ рд╕рд╛рдордиреЗ рдЖрдпрд╛
  • REST- рд╕реНрдЯрд╛рдЗрд▓ рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ RESTful рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЗрд╕рдХрд╛ API RESTful API (рдПрдирдЯреЛрдирд┐рдпрдо рд╕реНрдЯреЗрдЯреНрд╕ рд╣реИ);
  • REST рдХреЛ рдЕрдм рд╡реЗ рдХрд╣рддреЗ рд╣реИрдВ рдЬреЛ рд╡реЗ рдЪрд╛рд╣рддреЗ рд╣реИрдВ ...

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдпрджрд┐ рд╣рдо рдХреНрд▓рд╛рдЗрдВрдЯ-рд╕рд░реНрд╡рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдмрд╛рддрдЪреАрдд рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕реЗ рдЕрдиреБрд░реЛрдз-рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рд░реНрдорд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╣рд╛рдВ, рдЗрдВрдЯрд░реИрдХреНрд╢рди рд╣рдореЗрд╢рд╛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдирд╣реАрдВ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдм рдпрд╣ рдЗрдВрдЯрд░реИрдХреНрд╢рди рдмреЗрд╣рдж рд╕рд╛рдорд╛рдиреНрдп рд╣реИ, рдФрд░ рд╡реЗрдм рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдФрд░ рдмрд╣реБрдд рдЕрдЬреАрдм рд▓рдЧрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╡реЗрдм рд╕реЙрдХреЗрдЯ - рдпрд╣ рд╕рд┐рд░реНрдл REST рдирд╣реАрдВ рд╣реИред

рджреВрд╕рд░реЗ, REST рдореЗрдВ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕реАрдорд╛ рд╕рд░реНрд╡рд░ рдкрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рд╕реНрдерд┐рддрд┐ рдХреА рдХрдореА рд╣реИред рдпрд╣ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдХреНрд▓рд╛рдЗрдВрдЯ рд╣рдореЗрд╢рд╛ рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрд░реЛрдз рдХреЗ рд╕рд╛рде рд╕рд░реНрд╡рд░ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕реНрдерд┐рддрд┐ рд╕реЗ рдЧреБрдЬрд░рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд, рд░рд╛рдЬреНрдп рдХреНрд▓рд╛рдЗрдВрдЯ рдкрдХреНрд╖ рдкрд░ рд╕рд╣реЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рд╕рд░реНрд╡рд░ рдкрд░ рдХреЛрдИ рд╕рддреНрд░ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВред

рд╕реНрдкреНрд░рд┐рдВрдЧ рдореЗрдВ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреИрд╕реЗ рд▓рд┐рдЦреЗрдВ

рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдЬрд╛рд░реА рд░рдЦрдиреЗ, рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдФрд░ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП (рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЗ рд▓рд┐рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ):

 git clone git@github.com:ydvorzhetskiy/sb-client.git 

 mvnw spring-boot:run 

рдпрд╣ рдПрдХ рдкрд╣рд▓реЗ рд╕реЗ рд▓рд┐рдЦрд╛ рдХреНрд▓рд╛рдЗрдВрдЯ рдФрд░ рдХрдВрд╕реЛрд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╣реИ, рди рдХрд┐ рд╡реЗрдм рд╕рд░реНрд╡рд░ред

рд╣рдо рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ:

 <?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 http://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.1.2.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>ru.otus</groupId> <artifactId>demo-client</artifactId> <version>0.0.1-SNAPSHOT</version> <url>demo-client</url> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <!--   RestTemplate,    - --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>5.1.4.RELEASE</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>2.9.8</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.9.8</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.9.8</version> </dependency> <!-- Cache --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-cache</artifactId> </dependency> <!-- Retry --> <dependency> <groupId>org.springframework.retry</groupId> <artifactId>spring-retry</artifactId> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> </dependency> <!-- Hystrix --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> <version>2.0.2.RELEASE</version> </dependency> <dependency> <groupId>com.netflix.hystrix</groupId> <artifactId>hystrix-javanica</artifactId> <version>1.5.12</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project> 

рдХреНрд▓рд╛рдЗрдВрдЯ рдХрд╛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╣реИ:

1. RestTemplateConfig.java

 package ru.otus.democlient.config; @Configuration public class RestTemplateConfig { @Bean public RestTemplate restTemplate(RestTemplateBuilder restTemplateBuilder) { return restTemplateBuilder .setConnectTimeout(Duration.ofSeconds(2)) .setReadTimeout(Duration.ofSeconds(3)) .build(); } 

2. рдХреИрдЪреЗрдХреЛрдирдлрд┐рдЧ.рдЬрд╛рд╡рд╛

 package ru.otus.democlient.config; @Configuration public class CacheConfig { @Bean public CacheManager cacheManager() { return new ConcurrentMapCacheManager("sites"); } } 

рдФрд░ рдпрд╣рд╛рдБ SiteServiceRest.java рдлрд╝рд╛рдЗрд▓ рдХреА рд╕рд╛рдордЧреНрд░реА рд╣реИ:

 package ru.otus.democlient.service; import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand; import org.springframework.beans.factory.annotation.Value; import org.springframework.cache.annotation.Cacheable; import org.springframework.core.ParameterizedTypeReference; import org.springframework.http.HttpMethod; import org.springframework.retry.annotation.Backoff; import org.springframework.retry.annotation.Retryable; import org.springframework.stereotype.Service; import org.springframework.web.client.RestTemplate; import java.util.Collections; import java.util.List; @Service public class SiteServiceRest implements SiteService { private final RestTemplate restTemplate; private final String serverUrl; public SiteServiceRest( RestTemplate restTemplate, @Value("${application.server.url}") String serverUrl ) { this.restTemplate = restTemplate; this.serverUrl = serverUrl; } @Override public List<SiteInfo> findAllBlockedSites() { return restTemplate.exchange( serverUrl + "/blocked-sites", HttpMethod.GET, null, new ParameterizedTypeReference<List<SiteInfo>>() { } ).getBody(); } public List<SiteInfo> getDefaultSites() { return Collections.singletonList(new SiteInfo() {{ setUrl("http://vk.com/"); }}); } } 

рдереЛрдбрд╝рд╛ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдХрд░реЗрдВ:

  1. RestTemplate рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
  2. RestTemplate рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдПрдХ рдирд┐рдпрдорд┐рдд рдмреАрди рд╣реИред
  3. рдЬреИрдХреНрд╕рди рдХрд╛ рдЙрдкрдпреЛрдЧ JSON рдХреЛ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдореЗрдВ рдореИрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
  4. рдЕрдЧрд▓рд╛ - рдХреЗрд╡рд▓ рдЖрдкрдХреА рдХрд▓реНрдкрдирд╛ рдХреА рдЙрдбрд╝рд╛рди (рдЧреНрд░рд╛рд╣рдХ рдХреЛ рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ рдкрд░ рд╡рд┐рд╡рд░рдг рд╡реАрдбрд┐рдпреЛ рдореЗрдВ рд╣реИрдВ)ред

рд╕рд╣рдХрд░реНрдореА, рд╡реЗрдмрд┐рдирд╛рд░ рдмрд╣реБрдд рдЬрд╛рдирдХрд╛рд░реАрдкреВрд░реНрдг рдирд┐рдХрд▓рд╛, рдЗрд╕рд▓рд┐рдП, рдХреБрдЫ рднреА рдпрд╛рдж рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рджреЗрдЦрдирд╛ рдмреЗрд╣рддрд░ рд╣реИред рдЖрдк рдЕрд╕рд▓реА рдПрдкреАрдЖрдИ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВрдЧреЗ "рд▓рдбрд╝рд╛рдИ рдореЗрдВ", рд╕реЗрд╡рд╛ рдореЗрдВ @Cacheable рдЬреЛрдбрд╝рдиреЗ @Cacheable , рд╕реНрдкреНрд░рд┐рдВрдЧ рд░рд┐рдЯреНрд░реА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВ, рд╣рд┐рд╕реНрдЯрд┐рдХреНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдиреЗрдВ рдФрд░ рдмрд╣реБрдд рдХреБрдЫред рд╣рдо рдЖрдкрдХреЛ рд╕реНрдкреНрд░рд┐рдВрдЧ рдУрдкрди рдбреЗ рдкрд░ рднреА рдЖрдордВрддреНрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдмрд╣реБрдд рдЬрд▓реНрдж рдЖрдпреЛрдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдФрд░, рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, рд╣рдо рдкрд┐рдЫрд▓реЗ рдЦреБрд▓реЗ рдкрд╛рда рдкрд░ рдЖрдкрдХреА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ!

Source: https://habr.com/ru/post/hi440046/


All Articles