рдмрд╛рд╣рд░реА рд▓рд┐рдВрдХрд┐рдВрдЧ (рдбреАрдк рд▓рд┐рдВрдХрд┐рдВрдЧ) - рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░, рдпрд╣ рдПрдХ рд╕рд╛рдЗрдЯ рдкрд░ рд╣рд╛рдЗрдкрд░рд▓рд┐рдВрдХ рдХрд╛ рд╕реНрдерд╛рди рд╣реИ рдЬреЛ рдЙрд╕ рд╕рд╛рдЗрдЯ рдХреЗ рд╣реЛрдо (рд╣реЛрдо, рд╕реНрдЯрд╛рд░реНрдЯ) рдкреЗрдЬ рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдХрд┐рд╕реА рдЕрдиреНрдп рд╡реЗрдмрд╕рд╛рдЗрдЯ рдХреЗ рдкреЗрдЬ рдкрд░ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИред рдРрд╕реЗ рд▓рд┐рдВрдХ рдХреЛ рдмрд╛рд╣рд░реА рд▓рд┐рдВрдХ (рдбреАрдк рд▓рд┐рдВрдХ) рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛
рд╢рдмреНрдж
"рдбреАрдк рд▓рд┐рдВрдХреНрд╕" рдХреЛ рдЕрдВрдЧреНрд░реЗрдЬреА рднрд╛рд╖рд╛ рдХреЗ "рдбреАрдк рд▓рд┐рдВрдХреНрд╕" рдХреЗ рд╕рдмрд╕реЗ рдирд┐рдХрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрд╣ рд▓реЗрдЦ REST API рдкрд░ рдХреЗрдВрджреНрд░рд┐рдд рд╣реЛрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдЧрд╣рд░реЗ рд▓рд┐рдВрдХ рдХрд╛ рдЕрд░реНрде HTTP рд╕рдВрд╕рд╛рдзрдиреЛрдВ рд╕реЗ рд▓рд┐рдВрдХ рд╣реЛрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,
habr.com рдкрд░ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд▓реЗрдЦ рдХреЗ рд▓рд┐рдП рдЧрд╣рд░рд╛ рд▓рд┐рдВрдХ
habr.com/en/post/426691 рдЕрдВрдХред
HATEOAS , REST рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХрд╛ рдПрдХ рдШрдЯрдХ рд╣реИ рдЬреЛ API рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рд╣рд╛рдЗрдкрд░рдореАрдбрд┐рдпрд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЧреНрд░рд╛рд╣рдХ рдХреЗрд╡рд▓ рдирд┐рд╢реНрдЪрд┐рдд рдкрддреЗ, рдПрдкреАрдЖрдИ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдмрд┐рдВрджреБ рдХреЛ рдЬрд╛рдирддрд╛ рд╣реИ; рд╡рд╣ рд╕рд░реНрд╡рд░ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рд╕рдВрд╕рд╛рдзрдиреЛрдВ рд╕реЗ рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕реАрдЦрддрд╛ рд╣реИред рд╕рдВрд╕рд╛рдзрди рдХреЗ рд╡рд┐рдЪрд╛рд░реЛрдВ рдореЗрдВ рдХреНрд░рд┐рдпрд╛рдУрдВ рдпрд╛ рдЕрдиреНрдп рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЗ рд▓рд┐рдВрдХ рд╣реЛрддреЗ рд╣реИрдВ; рдХреНрд▓рд╛рдЗрдВрдЯ рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рддрд╛ рд╣реИ, рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдЙрдкрд▓рдмреНрдз рд▓рд┐рдВрдХ рд╕реЗ рдПрдХ рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдЪрдпрди рдХрд░рддрд╛ рд╣реИред рдЖрдк HATEOAS рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ
рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛ рдкрд░ рдпрд╛ Habr├й рдХреЗ рдЗрд╕ рдЕрджреНрднреБрдд
рд▓реЗрдЦ рдореЗрдВ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред
HATEOAS, REST API рдХрд╛ рдЕрдЧрд▓рд╛ рд╕реНрддрд░ рд╣реИред рд╣рд╛рдЗрдкрд░рдореАрдбрд┐рдпрд╛ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рд╡рд╣ рдПрдкреАрдЖрдИ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рджреМрд░рд╛рди рдЙрдардиреЗ рд╡рд╛рд▓реЗ рдХрдИ рд╕рд╡рд╛рд▓реЛрдВ рдХреЗ рдЬрд╡рд╛рдм рджреЗрддрд╛ рд╣реИ: рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб рдкрд░ рдХреНрд░рд┐рдпрд╛рдУрдВ рддрдХ рдкрд╣реБрдВрдЪ рдХреЛ рдХреИрд╕реЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдП, рдХреНрд▓рд╛рдЗрдВрдЯ рдФрд░ рд╕рд░реНрд╡рд░ рдХреЗ рдмреАрдЪ рддрдВрдЧ рдХрдиреЗрдХреНрдЯрд┐рд╡рд┐рдЯреА рд╕реЗ рдХреИрд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдпрд╛ рдЬрд╛рдП, рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЗ рдкрддреЗ рдХреИрд╕реЗ рдмрджрд▓реЗрдВред рд▓реЗрдХрд┐рди рдпрд╣ рдЗрд╕ рд╕рд╡рд╛рд▓ рдХрд╛ рдЬрд╡рд╛рдм рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ рдХрд┐ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЗ рдЧрд╣рд░реЗ рд▓рд┐рдВрдХ рдХреИрд╕реЗ рджрд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред
"рдХреНрд▓рд╛рд╕рд┐рдХ" рд░реАрд╕реНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ, рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдкрддреЛрдВ рдХреА рд╕рдВрд░рдЪрдирд╛ рдкрддрд╛ рд╣реИ; рд╡рд╣ рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рд░реАрд╕реНрдЯ рдПрдкреАрдЖрдИ рдореЗрдВ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдПрдХ рд╕рдВрд╕рд╛рдзрди рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рдПред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдСрдирд▓рд╛рдЗрди рд╕реНрдЯреЛрд░ рдореЗрдВ рдПрдХ рдкреБрд╕реНрддрдХ рдкреГрд╖реНрда рдХреЗ рд▓рд┐рдП рдПрдХ рдЧрд╣рд░реА рд▓рд┐рдВрдХ рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░рддрд╛ рд╣реИред URL рдмрд╛рд░
https://domain.test/books/1
рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЗ рдПрдбреНрд░реЗрд╕ рдмрд╛рд░ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддрд╛ рд╣реИред рдЧреНрд░рд╛рд╣рдХ рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ "1" рдкреБрд╕реНрддрдХ рдХреЗ рд╕рдВрд╕рд╛рдзрди рдХрд╛ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рд╣реИ, рдФрд░ рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдЗрд╕ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЛ REST API URL
https://api.domain.test/api/books/{id}
ред рдЗрд╕ рдкреНрд░рдХрд╛рд░, REST API рдореЗрдВ рдЗрд╕ рдкреБрд╕реНрддрдХ рдХреЗ рд╕рдВрд╕рд╛рдзрди рдХрд╛ рдЧрд╣рд░рд╛ рд▓рд┐рдВрдХ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
https://api.domain.test/api/books/1
ред
HATEOAS рдореЗрдВ, рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рд╕рдВрд╕рд╛рдзрди рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛рдУрдВ рдпрд╛ рдкрддрд╛ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрддрд╛ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рд╡рд╣ рд╣рд╛рд░реНрдбрдХреЛрдб рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд▓рд┐рдВрдХ рдХреЛ "рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ"ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, URL рдХреА рд╕рдВрд░рдЪрдирд╛ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рдЬреНрдЮрд╛рди рдХреЗ рдмрд┐рдирд╛ рдмрджрд▓ рд╕рдХрддреА рд╣реИ, HATEOAS рдЗрд╕реЗ рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЗрди рдЕрдВрддрд░реЛрдВ рдХреЗ рдХрд╛рд░рдг, рдЧрд╣рд░реА рд▓рд┐рдВрдХ рдХреЛ рдЙрд╕реА рддрд░рд╣ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреИрд╕реЗ рдХрд┐ рдХреНрд▓рд╛рд╕рд┐рдХ рд░реАрд╕реНрдЯ рдПрдкреАрдЖрдИред рд╣реИрд░рд╛рдиреА рдХреА рдмрд╛рдд рд╣реИ рдХрд┐ рд╣реЗрдЯреЛрдПрдПрд╕ рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рд▓рд┐рдВрдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡реНрдпрдВрдЬрдиреЛрдВ рдХреА рдПрдХ рдЗрдВрдЯрд░рдиреЗрдЯ рдЦреЛрдЬ рдиреЗ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдкрд░рд┐рдгрд╛рдо рдирд╣реАрдВ рджрд┐рдП, рдХреЗрд╡рд▓ рд╕реНрдЯреИрдХрдУрд╡рд░рдлреНрд▓реЛ рдкрд░ рдХреБрдЫ рд╣реИрд░рд╛рди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рд╢реНрдиред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдХрдИ рд╕рдВрднрд╛рд╡рд┐рдд рд╡рд┐рдХрд▓реНрдкреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗ рдФрд░ рд╕рд░реНрд╡рд╢реНрд░реЗрд╖реНрда рдХреЛ рдЪреБрдирдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВрдЧреЗред
рдкреНрд░рддрд┐рдпреЛрдЧрд┐рддрд╛ рдХреЗ рдмрд╛рд╣рд░ рд╢реВрдиреНрдп рд╡рд┐рдХрд▓реНрдк рдЧрд╣рд░реЗ рд▓рд┐рдВрдХ рдХреЛ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░рдирд╛ рд╣реИред рдпрд╣ рдХреБрдЫ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдпрд╛ рдореЛрдмрд╛рдЗрд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдВрддрд░рд┐рдХ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдкрд░ рд╕реАрдзреЗ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ HATEOAS рдХреА рднрд╛рд╡рдирд╛ рдореЗрдВ рд╣реИ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗрд╡рд▓ рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рдкреГрд╖реНрда рдЦреЛрд▓ рд╕рдХрддрд╛ рд╣реИ, рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ рд╕реЗ рд╢реБрд░реВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╕реАрдзреЗ рдЖрдВрддрд░рд┐рдХ рд╕рдВрд╕рд╛рдзрди рдкрд░ рдХреИрд╕реЗ рдЬрд╛рдирд╛ рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд┐рдХрд▓реНрдк рд╡реЗрдм рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рдирд╣реАрдВ рд╣реИ - рд╣рдо рдЙрдореНрдореАрдж рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЖрдВрддрд░рд┐рдХ рдкреЗрдЬ рдХреЗ рд▓рд┐рдВрдХ рдХреЛ рдмреБрдХрдорд╛рд░реНрдХ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдкреГрд╖реНрда рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рд╕реЗ рд╣рдореЗрдВ рд╕рд╛рдЗрдЯ рдХреЗ рдореБрдЦреНрдп рдкреГрд╖реНрда рдкрд░ рд╡рд╛рдкрд╕ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рддреЛ, рдкрд╣рд▓рд╛ рд╡рд┐рдХрд▓реНрдк: HATEOAS API URL рд╣рд╛рд░реНрдбрдХреЛрдбред рдЧреНрд░рд╛рд╣рдХ рд╕рдВрд╕рд╛рдзрди рдкрддреЗ рдХреА рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдЬрд╛рдирддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдЧрд╣рд░реЗ рд▓рд┐рдВрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдФрд░ рдпрд╣ рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рд▓реБрдХрдЕрдк рдХреЗ рд▓рд┐рдП рд╕рдВрд╕рд╛рдзрди рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕рд░реНрд╡рд░ рдкреБрд╕реНрддрдХ рд╕рдВрд╕рд╛рдзрди рдХреЗ рд╕рдВрджрд░реНрдн рдХреЗ рд░реВрдк рдореЗрдВ рдПрдбреНрд░реЗрд╕
https://api.domain.test/api/books/1
рд╣реИред рдЧреНрд░рд╛рд╣рдХ рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ "1" рдкреБрд╕реНрддрдХ рдХрд╛ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рд╣реИ рдФрд░ рдЧрд╣рд░реЗ рд▓рд┐рдВрдХ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдкрд░ рдпрд╣ URL рдЕрдкрдиреЗ рдЖрдк рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рдХрд╛рдордХрд╛рдЬреА рд╡рд┐рдХрд▓реНрдк рд╣реИ, рд▓реЗрдХрд┐рди HATEOAS рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдХрд░рддрд╛ рд╣реИред рдкрддрд╛ рд╕рдВрд░рдЪрдирд╛ рдФрд░ рд╕рдВрд╕рд╛рдзрди рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЛ рдЕрдм рдирд╣реАрдВ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЕрдиреНрдпрдерд╛ рдЧреНрд░рд╛рд╣рдХ рдЯреВрдЯ рдЬрд╛рдПрдЧрд╛, рдПрдХ рдХрдареЛрд░ рд╕рдВрдмрдВрдз рд╣реИред рдпрд╣ HATEOAS рдирд╣реАрдВ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╡рд┐рдХрд▓реНрдк рд╣рдорд╛рд░реЗ рдЕрдиреБрд░реВрдк рдирд╣реАрдВ рд╣реИред
рджреВрд╕рд░рд╛ рд╡рд┐рдХрд▓реНрдк рдХреНрд▓рд╛рдЗрдВрдЯ URL рдореЗрдВ REST API URL рдХреЛ рд╕реНрдерд╛рдирд╛рдкрдиреНрди рдХрд░рдирд╛ рд╣реИред рдПрдХ рдкреБрд╕реНрддрдХ рдХреЗ рд╕рд╛рде рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЧрд╣рд░рд╛ рд▓рд┐рдВрдХ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛:
https://domain.test/books?url=https://api.domain.test/api/books/1
ред рдпрд╣рд╛рдВ, рдХреНрд▓рд╛рдЗрдВрдЯ рд╕рд░реНрд╡рд░ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рд╕рдВрд╕рд╛рдзрди рд▓рд┐рдВрдХ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкреГрд╖реНрда рдкрддреЗ рдореЗрдВ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдЕрдзрд┐рдХ HATEOAS рдХреА рддрд░рд╣ рд╣реИ, рдЧреНрд░рд╛рд╣рдХ рдХреЛ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛рдУрдВ рдФрд░ рдкрддреЗ рдХреА рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рдкрддрд╛ рд╣реИ, рд╡рд╣ рдПрдХ рд▓рд┐рдВрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рддрд░рд╣ рдХреЗ рдЗрди-рдбреЗрдкреНрде рд▓рд┐рдВрдХ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдкрд░, рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдпреВрдЖрд░рдПрд▓ рдкреИрд░рд╛рдореАрдЯрд░ рд╕реЗ REST API рд▓рд┐рдВрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╡рд╛рдВрдЫрд┐рдд рд╕рдВрд╕рд╛рдзрди рдкреНрд░рд╛рдкреНрдд рд╣реЛрдЧрд╛ред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рдорд╛рдзрд╛рди рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ, рдФрд░ HATEOAS рдХреА рднрд╛рд╡рдирд╛ рдореЗрдВ рдХрд╛рдлреА рд╣реИред рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдк рдЕрдкрдиреЗ рдмреБрдХрдорд╛рд░реНрдХ рдореЗрдВ рдРрд╕рд╛ рд▓рд┐рдВрдХ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рддреЛ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рд╣рдо рдПрдкреАрдЖрдИ рдореЗрдВ рд╕рдВрд╕рд╛рдзрди рдХрд╛ рдкрддрд╛ рдирд╣реАрдВ рдмрджрд▓ рдкрд╛рдПрдВрдЧреЗ (рдпрд╛ рд╣рдореЗрдВ рд╣рдореЗрд╢рд╛ рдПрдХ рдирдП рдкрддреЗ рдкрд░ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛)ред рдПрдХ рдмрд╛рд░ рдлрд┐рд░, HATEOAS рдХреЗ рд▓рд╛рднреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдЦреЛ рдЧрдпрд╛ рд╣реИ, рдпрд╣ рд╡рд┐рдХрд▓реНрдк рднреА рдЖрджрд░реНрд╢ рдирд╣реАрдВ рд╣реИред
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдкреЗрд░реНрдорд▓рд┐рдВрдХреНрд╕ рд╣реЛрдВ, рдЬреЛ рдХрд┐ рдмрджрд▓ рд╕рдХрддреА рд╣реИрдВред рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рд╕рдорд╛рдзрд╛рди рдореМрдЬреВрдж рд╣реИ рдФрд░ рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдХрдИ рд╕рд╛рдЗрдЯреЗрдВ рдЖрдВрддрд░рд┐рдХ рдкреГрд╖реНрдареЛрдВ рдХреЗ рд▓рд┐рдП рдЫреЛрдЯреЗ рд▓рд┐рдВрдХ рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рд╕рд╛рдЭрд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╕рдВрдХреНрд╖рд┐рдкреНрддрддрд╛ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЙрдирдХрд╛ рд▓рд╛рдн рдпрд╣ рд╣реИ рдХрд┐ рд╕рд╛рдЗрдЯ рдкреГрд╖реНрда рдХрд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкрддрд╛ рдмрджрд▓ рд╕рдХрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдРрд╕реЗ рд▓рд┐рдВрдХ рдирд╣реАрдВ рдЯреВрдЯреЗрдВрдЧреЗред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, Microsoft
http://go.microsoft.com/fwlink/?LinkId=XXX
рдлреЙрд░реНрдо рдХреЗ рдкреГрд╖реНрдареЛрдВ рдХреА рдорджрдж рдХреЗ рд▓рд┐рдП рд╡рд┐рдВрдбреЛрдЬ рд▓рд┐рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рд╡рд░реНрд╖реЛрдВ рд╕реЗ, Microsoft рд╕рд╛рдЗрдЯреЛрдВ рдХреЛ рдХрдИ рдмрд╛рд░ рдлрд┐рд░ рд╕реЗ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд┐рдВрдбреЛрдЬ рдХреЗ рдкреБрд░рд╛рдиреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ рд▓рд┐рдВрдХ рдХрд╛рдо рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦрддреЗ рд╣реИрдВред
рдпрд╣ рдХреЗрд╡рд▓ HATEOAS рдХреЗ рд▓рд┐рдП рдЗрд╕ рд╕рдорд╛рдзрд╛рди рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИред рдФрд░ рдпрд╣ рддреАрд╕рд░рд╛ рд╡рд┐рдХрд▓реНрдк рд╣реИ - REST API рдореЗрдВ рдЕрджреНрд╡рд┐рддреАрдп рдЧрд╣рд░реЗ рд▓рд┐рдВрдХ рдЖрдЗрдбреЗрдВрдЯрд┐рдлрд╝рд╛рдпрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред рдЕрдм рдкреБрд╕реНрддрдХ рдкреГрд╖реНрда рдХрд╛ рдкрддрд╛ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:
https://domain.test/books?deepLinkId=3f0fd552-e564-42ed-86b6-a8e3055e2763
ред рдЗрд╕ рддрд░рд╣ рдХреЗ рдЗрди-рдбреЗрдкреНрде рд▓рд┐рдВрдХ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рддреЗ рд╕рдордп, рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рд╕рд░реНрд╡рд░ рд╕реЗ рдкреВрдЫрдирд╛ рдЪрд╛рд╣рд┐рдП: рдЗрд╕ рддрд░рд╣ рдХреЗ
deepLinkId
рд▓рд┐рдВрдХ
deepLinkId
рд╕реЗ рдХреНрдпрд╛ рд╕рдВрд╕рд╛рдзрди рд▓рд┐рдВрдХ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ? рд╕рд░реНрд╡рд░ рд▓рд┐рдВрдХ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░ рджреЗрдЧрд╛
https://api.domain.test/api/books/1
(рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ, рдпрд╛ рддреБрд░рдВрдд рдПрдХ рд╕рдВрд╕рд╛рдзрди, рддрд╛рдХрд┐ рджреЛ рдмрд╛рд░ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ)ред рдпрджрд┐ REST API рдореЗрдВ рд╕рдВрд╕рд╛рдзрди рдкрддрд╛ рдмрджрд▓рддрд╛ рд╣реИ, рддреЛ рд╕рд░реНрд╡рд░ рдмрд╕ рдПрдХ рдФрд░ рд▓рд┐рдВрдХ рд▓реМрдЯрд╛рдПрдЧрд╛ред рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдПрдХ рд░рд┐рдХреЙрд░реНрдб рд╕рд╣реЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рд╕рдВрджрд░реНрдн рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ 3f0fd552-e564-42ed-86b6-a8e3055e2763 рдкреБрд╕реНрддрдХ 1 тАЛтАЛрдХреА рдЗрдХрд╛рдИ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реИред
рдЗрд╕рдХреЗ рд▓рд┐рдП, рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдореЗрдВ рдПрдХ
deepLinkId
рдлрд╝реАрд▓реНрдб рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд┐рд╕рдореЗрдВ рдЙрдирдХреЗ рдЧрд╣рд░реЗ рд▓рд┐рдВрдХ рдХреЗ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рд╣реЛрдВ, рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдкреГрд╖реНрда рдХреЗ рдкрддреЗ рдкрд░ рдЙрдиреНрд╣реЗрдВ рд╕реНрдерд╛рдирд╛рдкрдиреНрди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдпрд╣ рдкрддрд╛ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдмреБрдХрдорд╛рд░реНрдХ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рджреЛрд╕реНрддреЛрдВ рдХреЛ рднреЗрдЬрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЧреНрд░рд╛рд╣рдХ рдХреБрдЫ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЖрдкрдХреЛ рд╕рдВрдкреВрд░реНрдг рд░реВрдк рд╕реЗ рдПрдкреАрдЖрдИ рдХреЗ рд▓рд┐рдП HATEOAS рдХреЗ рд▓рд╛рднреЛрдВ рдХреЛ рдмрдЪрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рдЙрджрд╛рд╣рд░рдг
рдпрд╣ рд▓реЗрдЦ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдмрд┐рдирд╛ рдкреВрд░рд╛ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдЕрд╡рдзрд╛рд░рдгрд╛ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреВрдЯ / рдХреЛрдЯрд▓рд┐рди рдкрд░ рдмреИрдХрдПрдВрдб рдХреЗ рд╕рд╛рде рдХрд╛рд▓реНрдкрдирд┐рдХ рдСрдирд▓рд╛рдЗрди рд╕реНрдЯреЛрд░ рдХреИрдЯрд▓реЙрдЧ рд╕рд╛рдЗрдЯ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдФрд░ Vue / рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкрд░ рдПрдХ рдПрд╕рдкреАрдП рджреГрд╢реНрдпрдкрдЯрд▓ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рд╕реНрдЯреЛрд░ рдХрд┐рддрд╛рдмреЗрдВ рдФрд░ рдкреЗрдВрд╕рд┐рд▓ рдмреЗрдЪрддрд╛ рд╣реИ, рд╕рд╛рдЗрдЯ рдореЗрдВ рджреЛ рдЦрдВрдб рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рдЖрдк рдЙрддреНрдкрд╛рджреЛрдВ рдХреА рд╕реВрдЪреА рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЙрдирдХреЗ рдкреГрд╖реНрда рдЦреЛрд▓ рд╕рдХрддреЗ рд╣реИрдВред
рдзрд╛рд░рд╛ "рдкреБрд╕реНрддрдХреЗрдВ":

рдПрдХ рдкреБрд╕реНрддрдХ рдкреГрд╖реНрда:

рдорд╛рд▓ рдХреЗ рднрдВрдбрд╛рд░рдг рдХреЗ рд▓рд┐рдП, рд╕реНрдкреНрд░рд┐рдВрдЧ рдбреЗрдЯрд╛ рдЬреЗрдкреАрдП рдЗрдХрд╛рдЗрдпрд╛рдБ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХреА рдЧрдИ рд╣реИрдВ:
enum class EntityType { PEN, BOOK } @Entity class Pen(val color: String) { @Id @Column(columnDefinition = "uuid") val id: UUID = UUID.randomUUID() @OneToOne(cascade = [CascadeType.ALL]) val deepLink: DeepLink = DeepLink(EntityType.PEN, id) } @Entity class Book(val name: String) { @Id @Column(columnDefinition = "uuid") val id: UUID = UUID.randomUUID() @OneToOne(cascade = [CascadeType.ALL]) val deepLink: DeepLink = DeepLink(EntityType.BOOK, id) } @Entity class DeepLink( @Enumerated(EnumType.STRING) val entityType: EntityType, @Column(columnDefinition = "uuid") val entityId: UUID ) { @Id @Column(columnDefinition = "uuid") val id: UUID = UUID.randomUUID() }
рдбреАрдк рд▓рд┐рдВрдХ
DeepLink
рдмрдирд╛рдиреЗ рдФрд░ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП,
DeepLink
рдЗрдХрд╛рдИ рдХрд╛
DeepLink
,
DeepLink
рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкреНрд░рддреНрдпреЗрдХ рдбреЛрдореЗрди рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рд╛рде рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЬрд┐рд╕ рд╕рдордп рдЗрдХрд╛рдИ рдмрдирд╛рдИ рдЧрдИ рдереА рдЙрд╕ рд╕рдордп UUID рдорд╛рдирдХ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рд╕реНрд╡рдпрдВ рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИред рдЗрд╕рдХреА рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдЧрд╣рд░реА рдХрдбрд╝реА рдХреА рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛, рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдФрд░ рдЙрд╕ рдЗрдХрд╛рдИ рдХрд╛ рдкреНрд░рдХрд╛рд░ рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕рд╕реЗ рд▓рд┐рдВрдХ рдЖрдЧреЗ рдмрдврд╝рддрд╛ рд╣реИред
рд╕рд░реНрд╡рд░ рдХрд╛ REST API HATEOAS рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЖрдпреЛрдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, API рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдмрд┐рдВрджреБ рдореЗрдВ рдЙрддреНрдкрд╛рдж рд╕рдВрдЧреНрд░рд╣ рдХреЗ рд▓рд┐рдВрдХ рд╣реЛрддреЗ рд╣реИрдВ, рд╕рд╛рде рд╣реА рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдХреЗ рдЧрд╣рд░реЗ рд▓рд┐рдВрдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП
#deepLink
рд▓рд┐рдВрдХ рднреА рд╢рд╛рдорд┐рд▓ рд╣реИ:
GET http://localhost:8080/api { "_links": { "pens": { "href": "http://localhost:8080/api/pens" }, "books": { "href": "http://localhost:8080/api/books" }, "deepLink": { "href": "http://localhost:8080/api/links/{id}", "templated": true } } }
рдХреНрд▓рд╛рдЗрдВрдЯ, "рдкреБрд╕реНрддрдХреЗрдВ" рдЕрдиреБрднрд╛рдЧ
#books
рд╕рдордп, рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдмрд┐рдВрджреБ рдкрд░
#books
рд▓рд┐рдВрдХ рдкрд░ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЗ рд╕рдВрдЧреНрд░рд╣ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рддрд╛ рд╣реИ:
GET http://localhost:8080/api/books ... { "name": "Harry Potter", "deepLinkId": "4bda3c65-e5f7-4e9b-a8ec-42d16488276f", "_links": { "self": { "href": "http://localhost:8080/api/books/1272e287-07a5-4ebc-9170-2588b9cf4e20" } } }, { "name": "Cryptonomicon", "deepLinkId": "a23d92c2-0b7f-48d5-88bc-18f45df02345", "_links": { "self": { "href": "http://localhost:8080/api/books/5d04a6d0-5bbc-463e-a951-a9ff8405cc70" } } } ...
рдПрд╕рдкреАрдП рд╡реА рд░рд╛рдЙрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдкреБрд╕реНрддрдХ рдкреГрд╖реНрда рдХрд╛
{ path: '/books/:deepLinkId', name: 'book', component: Book, props: true }
рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдкреБрд╕реНрддрдХ рд╕реВрдЪреА рдХреЗ рд▓рд┐рдВрдХ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддреЗ рд╣реИрдВ:
<router-link :to="{name: 'book', params: {link: book._links.self.href, deepLinkId: book.deepLinkId}}">{{ book.name }}</router-link>
ред
рдпрд╣реА рд╣реИ, рдЬрдм рдЖрдк рдХрд┐рд╕реА рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреБрд╕реНрддрдХ рдХреЗ рдкреГрд╖реНрда рдХреЛ рдЦреЛрд▓рддреЗ рд╣реИрдВ, рддреЛ
Book
рдШрдЯрдХ рдХреЛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рджреЛ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ:
link
(REST API рдореЗрдВ рдкреБрд╕реНрддрдХ рд╕рдВрд╕рд╛рдзрди рдХрд╛ рд▓рд┐рдВрдХ,
#self
рд▓рд┐рдВрдХ рдХреЗ
href
рдХреНрд╖реЗрддреНрд░ рдХрд╛ рдореВрд▓реНрдп) рдФрд░ рд╕рдВрд╕рд╛рдзрди рд╕реЗ
deepLinkId
)ред
const Book = { template: `<div>{{ 'Book: ' + book.name }}</div>`, props: { link: null, deepLinkId: null }, data() { return { book: { name: "" } } }, mounted() { let url = this.link == null ? '/api/links/' + this.deepLinkId : this.link; fetch(url).then((response) => { return response.json().then((json) => { this.book = json }) }) } }
Vue рд░реВрдЯрд░ рдкреГрд╖реНрда
/books/:deepLinkId
рдХреЗ рдкрддреЗ рдкрд░
deepLinkId
рдХрд╛ рдорд╛рди рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдШрдЯрдХ
link
рд╕рдВрдкрддреНрддрд┐ рд╕реЗ рд╕реАрдзреЗ рд▓рд┐рдВрдХ рджреНрд╡рд╛рд░рд╛ рд╕рдВрд╕рд╛рдзрди рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рддрд╛ рд╣реИред рдЬрдм рдкреГрд╖реНрда рдХреЛ рд░рд┐рдлреНрд░реЗрд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, Vue Router рдШрдЯрдХ рдЧреБрдг
deepLinkId
рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдкреГрд╖реНрда рдкрддреЗ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред
link
рд╕рдВрдкрддреНрддрд┐
null
рд░рд╣рддреА рд╣реИред рдШрдЯрдХ рдЬрд╛рдВрдЪрддрд╛ рд╣реИ: рдпрджрд┐ рд╕рдВрдЧреНрд░рд╣ рд╕реЗ рдПрдХ рд╕реАрдзрд╛ рд▓рд┐рдВрдХ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдЙрд╕ рдкрд░ рд╕рдВрд╕рд╛рдзрди рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рдХреЗрд╡рд▓
deepLinkId
рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛
deepLinkId
, рддреЛ рдЗрд╕реЗ рдбреАрдк рд▓рд┐рдВрдХ рджреНрд╡рд╛рд░рд╛ рд╕рдВрд╕рд╛рдзрди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ рд╕реЗ
#deepLink
рд▓рд┐рдВрдХ рдореЗрдВ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдмреИрдХрдПрдВрдб рдкрд░, рдЧрд╣рд░реЗ рд▓рд┐рдВрдХ рдХреЗ рд▓рд┐рдП рдирд┐рдпрдВрддреНрд░рдХ рд╡рд┐рдзрд┐ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддреА рд╣реИ:
@GetMapping("/links/{id}") fun deepLink(@PathVariable id: UUID?, response: HttpServletResponse?): ResponseEntity<Any> { id!!; response!! val deepLink = deepLinkRepo.getOne(id) val path: String = when (deepLink.entityType) { EntityType.PEN -> linkTo(methodOn(MainController::class.java).getPen(deepLink.entityId)) EntityType.BOOK -> linkTo(methodOn(MainController::class.java).getBook(deepLink.entityId)) }.toUri().path response.sendRedirect(path) return ResponseEntity.notFound().build() }
рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдЧрд╣рд░реЗ рд▓рд┐рдВрдХ рдХрд╛ рд╕рд╛рд░ рд╣реИред рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЗрдХрд╛рдИ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдирд┐рдпрдВрддреНрд░рдХ рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд┐рдВрдХ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдХрд┐
entityId
рджреНрд╡рд╛рд░рд╛ рдЕрдкрдирд╛ рд╕рдВрд╕рд╛рдзрди
entityId
ред рдЕрдиреБрд░реЛрдз рдЗрд╕ рдкрддреЗ рдкрд░ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЕрдЧрд░ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЗрдХрд╛рдИ рдирд┐рдпрдВрддреНрд░рдХ рдХреЗ рд▓рд┐рдП рд▓рд┐рдВрдХ рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ
deepLink
рд╡рд┐рдзрд┐ рдореЗрдВ рд▓рд┐рдВрдХ рдЧрдарди рдХреЗ рддрд░реНрдХ рдХреЛ рдмрджрд▓рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛ред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдкреВрд░реНрдг рд╕реНрд░реЛрдд рдХреЛрдб
Github рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИред