GraphQL - рдПрдХ рдирдП рддрд░реАрдХреЗ рд╕реЗ рдПрдкреАрдЖрдИ

GraphQL рдХреНрд╡реЗрд░реА рднрд╛рд╖рд╛ рдХреНрдпрд╛ рд╣реИ? рдпрд╣ рддрдХрдиреАрдХ рдХреНрдпрд╛ рд▓рд╛рдн рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИ рдФрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдХрд┐рди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝реЗрдЧрд╛? рдкреНрд░рднрд╛рд╡реА рдврдВрдЧ рд╕реЗ GraphQL рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВ? рдХрдЯреМрддреА рдХреЗ рддрд╣рдд рдпрд╣ рд╕рдм рдХреЗ рдмрд╛рд░реЗ рдореЗрдВред



рд▓реЗрдЦ рдЬреЛрдХрд░ 2017 рд╕рдореНрдореЗрд▓рди рд╕реЗ рд╡реНрд▓рд╛рджрд┐рдореАрд░ рддреНрд╕реБрдХреБрд░ ( рд╡рд▓реЛрдбрд┐рдорд┐рд░рддреНрд╕реБрдХреБрд░ ) рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рдЪрдпрд╛рддреНрдордХ рд╕реНрддрд░ рдХреА рд░рд┐рдкреЛрд░реНрдЯ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИред


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



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

рд╕рд┐рдВрдкрд▓ рдПрдкреАрдЖрдИ рдФрд░ рдЙрд╕рдХреА рд╕рдорд╕реНрдпрд╛рдПрдВ


рдЖрдЗрдП рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рд╕рд╛рдорд╛рдиреНрдп-рдкреНрд░рдпреЛрдЬрди рдПрдкреАрдЖрдИ (рдЬреЛ рдХрд┐, рдордВрдЪ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рд╕рднреА рджреБрдХрд╛рдиреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдПрдкреАрдЖрдИ) рд╣рдо рд╕реНрдЯреЛрд░ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдЗрдП рд╣рдо рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВред

рдРрд╕реА рд╕рд╛рдЗрдЯ рдкрд░ рдЙрддреНрдкрд╛рдж рдкреГрд╖реНрда рдХреЗ рд▓рд┐рдП, рдЙрддреНрдкрд╛рдж рдХрд╛ рдирд╛рдо, рдореВрд▓реНрдп, рдЪрд┐рддреНрд░, рд╡рд┐рд╡рд░рдг, рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд╛рдирдХрд╛рд░реА рдФрд░ рдмрд╣реБрдд рдХреБрдЫ рд╡рд╛рдкрд╕ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╡рд┐рдЬрд╝рд┐рдЯрд░ рдкрд░ рд╕реНрдЯреЛрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреВрд░реНрдг рд╕рдорд╛рдзрд╛рди рдореЗрдВ, рджреЛ рджрд░реНрдЬрди рд╕реЗ рдЕрдзрд┐рдХ рдРрд╕реЗ рдбреЗрдЯрд╛ рдлрд╝реАрд▓реНрдб рд╣реИрдВред HTTP API рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдЗрд╕ рддрд░рд╣ рдХреЗ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ рд╕рдорд╛рдзрд╛рди /products/:id рд╕рдВрд╕рд╛рдзрди рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдирд╛ рд╣реИ, рдЬреЛ GET рдЕрдиреБрд░реЛрдз рдкрд░ рдЙрддреНрдкрд╛рдж рдбреЗрдЯрд╛ рд▓реМрдЯрд╛рддрд╛ рд╣реИред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдбреЗрдЯрд╛ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ:

 { "id": "59eb83c0040fa80b29938e3f", "title": "Combo Pack with Dreamy Eyes 12\" (Pink) Soft Toy", "price": 26.99, "description": "Spread Unicorn love amongst your friends and family by purchasing a Unicorn adoption combo pack today. You'll receive your very own fabulous adoption pack and a 12\" Dreamy Eyes (Pink) cuddly toy. It makes the perfect gift for loved ones. Go on, you know you want to, adopt today!", "sku":"010", "images": [   "http://localhost:8080/img/918d8d4cc83d4e5f8680ca4edfd5b6b2.jpg",   "http://localhost:8080/img/f343889c0bb94965845e65d3f39f8798.jpg",   "http://localhost:8080/img/dd55129473e04f489806db0dc6468dd9.jpg",   "http://localhost:8080/img/64eba4524a1f4d5d9f1687a815795643.jpg",   "http://localhost:8080/img/5727549e9131440dbb3cd707dce45d0f.jpg",   "http://localhost:8080/img/28ae9369ec3c442dbfe6901434ad15af.jpg" ] } 



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



рдорд╛рди рд▓реАрдЬрд┐рдП, рд╕рд╛рджрдЧреА рдХреЗ рд▓рд┐рдП, рд╣рдо рд╕рдВрд╕рд╛рдзрдиреЛрдВ /products рдФрд░ /products/:id рд▓рд┐рдП рдПрдХ рд╣реА рдЙрддреНрдкрд╛рдж рдбреЗрдЯрд╛ рдореЙрдбрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓реЗрддреЗ рд╣реИрдВред рдРрд╕реЗ рдЙрддреНрдкрд╛рджреЛрдВ рдХреЗ рд╕рдВрдЧреНрд░рд╣ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдХрдИ рд╣реЛрдВрдЧреЗред рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдпреЛрдЬрдирд╛ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

 GET /products [ {   title   price   images   description   info   ... } ] 

рдЕрдм рдЙрддреНрдкрд╛рдж рд╕рдВрдЧреНрд░рд╣ рдХреЗ рд▓рд┐рдП рд╕рд░реНрд╡рд░ рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ "рдкреЗрд▓реЛрдб" рдХреЛ рджреЗрдЦреЗрдВред рдпрд╣рд╛рдБ рджреЛ рджрд░реНрдЬрди рд╕реЗ рдЕрдзрд┐рдХ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рдмреАрдЪ рдЧреНрд░рд╛рд╣рдХ рджреНрд╡рд╛рд░рд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

{
"id": "59eb83c0040fa80b29938e3f",
"title": "Combo Pack with Dreamy Eyes 12\" (Pink) Soft Toy",
"price": 26.99,
"info": "Spread Unicorn love amongst your friends and family by purchasing a Unicorn adoption combo pack today. You'll receive your very own fabulous adoption pack and a 12\" Dreamy Eyes (Pink) cuddly toy. It makes the perfect gift for loved ones. Go on, you know you want to, adopt todayl",
" description": "Your fabulous Unicorn adoption combo pack contains:\nA 12\" Dreamy Eyes (Pink) Unicorn Soft Toy\nA blank Unicorn adoption certificate тАФ name your Unicorn!\nA confirmation letter\nA Unicorn badge\nA Unicorn key ring\nA Unicorn face mask (self assembly)\nA Unicorn bookmark\nA Unicorn colouring in sheet\nA A4 Unicorn posters\n2 x Unicorn postcards\n3 x Unicorn stickers",
"images": [
"http://localhost:8080/img/918d8d4cc83d4e5f8680ca4edfd5b6b2.jpg",
"http://localhost:8080/img/f343889c0bb94965845e65d3f39f8798.jpg",
"http://localhost:8080/img/dd55129473604f489806db0dC6468dd9.jpg",
"http://localhost:8080/img/64eba4524a1f4d5d9f1687a815795643.jpg",
"http://localhost:8080/img/5727549e9l3l440dbb3cd707dce45d0f.jpg",
"http://localhost:8080/img/28ae9369ec3c442dbfe6901434ad15af.jpg"
],
...
}


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

рдЖрдЗрдП рдЕрдм рдХрд╛рд░реНрдЯ рдкреЗрдЬ рджреЗрдЦреЗрдВред рдЯреЛрдХрд░реА рдореЗрдВ, рд╕реНрд╡рдпрдВ рдЙрддреНрдкрд╛рджреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЙрдирдХреА рдорд╛рддреНрд░рд╛ (рдЗрд╕ рдЯреЛрдХрд░реА рдореЗрдВ), рдореВрд▓реНрдп, рд╕рд╛рде рд╣реА рдкреВрд░реЗ рдСрд░реНрдбрд░ рдХреА рдХреБрд▓ рд▓рд╛рдЧрдд рднреА рд╣реИ:



рдпрджрд┐ рд╣рдо HTTP рдПрдкреАрдЖрдИ рдХреЗ рд╕рд░рд▓ рдореЙрдбрд▓рд┐рдВрдЧ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рдЬрд╛рд░реА рд░рдЦрддреЗ рд╣реИрдВ, рддреЛ рдЯреЛрдХрд░реА рдХреЛ рд╕рдВрд╕рд╛рдзрди / рдХрд╛рд░реНрдЯ / / рдЖрдИрдбреА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреА рдкреНрд░рд╕реНрддреБрддрд┐ рдЗрд╕ рдЯреЛрдХрд░реА рдореЗрдВ рдЬреЛрдбрд╝реЗ рдЧрдП рдЙрддреНрдкрд╛рджреЛрдВ рдХреЗ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддреА рд╣реИ:

 { "id": 1, "items": [   {     "product": "/products/59eb83c0040fa80b29938e3f",     "quantity": 1,     "total": 26.99   },   {     "product": "/products/59eb83c0040fa80b29938e40",     "quantity": 2,     "total": 25.98   },   {     "product": "/products/59eb88bd040fa8125aa9c400",     "quantity": 1,     "total": 26.99   } ], "subTotal": 79.96 } 

рдЕрдм, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕рд╛рдордиреЗ рдХреЗ рдЫреЛрд░ рдкрд░ рддреАрди рдЙрддреНрдкрд╛рджреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдЯреЛрдХрд░реА рдЦреАрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЪрд╛рд░ рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ: рдПрдХ рдЯреЛрдХрд░реА рдХреЛ рдЦреБрдж рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдФрд░ рддреАрди рдЕрдиреБрд░реЛрдз рдЙрддреНрдкрд╛рдж рдбреЗрдЯрд╛ (рдирд╛рдо, рдореВрд▓реНрдп рдФрд░ SKU рдирдВрдмрд░) рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред

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

рдмреЗрд╢рдХ, рдпрд╣ рд╕рдорд╛рдзрд╛рди рдЙрддреНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рдирд╣реАрдВ рд╣реИред рд╕рдорд╕реНрдпрд╛ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдЯреЛрдХрд░реА рдХреЗ рд▓рд┐рдП рдкреНрд░рдХреНрд╖реЗрдкрдг рд╕рдорд░реНрдерди рдХреЛ рдЬреЛрдбрд╝рдирд╛ рд╣реИред рдРрд╕реЗ рдЕрдиреБрдорд╛рдиреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдЯреЛрдХрд░реА рдХреЗ рдбреЗрдЯрд╛ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЙрддреНрдкрд╛рджреЛрдВ рдкрд░ рдбреЗрдЯрд╛ рд▓реМрдЯрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рдкреНрд░рдХреНрд╖реЗрдкрдг рдмрд╣реБрдд рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЯреЛрдХрд░реА рдкреГрд╖реНрда рдкрд░ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдЙрддреНрдкрд╛рдж рдХреА рд╕реВрдЪреА рд╕рдВрдЦреНрдпрд╛ (SKU) рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдХрд╣реАрдВ рдФрд░ рдирд╣реАрдВ SKU рдХреА рдЬрд░реВрд░рдд рдереАред

 GET /carts/1?projection=with-products 



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



(рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд╡рд┐рдЬрд╝рд┐рдЯрд░ рдбрд┐рдЬрд╝рд╛рдЗрдирд░ рдореЗрдВ, рдЖрдк рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк рдХрд┐рд╕ рдЙрддреНрдкрд╛рдж рдХрд╛ рдбреЗрдЯрд╛ рдЙрддреНрдкрд╛рдж рдкреГрд╖реНрда рдкрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рдЯреЛрдХрд░реА рдореЗрдВ рдХреМрди рд╕рд╛ рдбреЗрдЯрд╛ рджрд┐рдЦрд╛рдирд╛ рд╣реИ)

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

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

"рдХреЗрдХ рдкрд░ рдЪреЗрд░реА" рдХреЗ рд░реВрдк рдореЗрдВ, рдЖрдЗрдП рдПрдХ рдФрд░ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдореБрджреНрджреЗ рдХреЛ рджреЗрдЦреЗрдВред рдПрдХ рд╕рд╛рдзрд╛рд░рдг HTTP рдПрдкреАрдЖрдИ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕рд░реНрд╡рд░ рдбреЗрд╡рд▓рдкрд░ рдХреЛ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреНрд▓рд╛рдЗрдВрдЯ рдХрд┐рд╕ рддрд░рд╣ рдХрд╛ рдбреЗрдЯрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИред рдХреНрдпрд╛ рдореВрд▓реНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ? рд╡рд┐рд╡рд░рдг? рдПрдХ рдпрд╛ рд╕рднреА рдЪрд┐рддреНрд░?



рддрджрдиреБрд╕рд╛рд░, рдХрдИ рд╕рд╡рд╛рд▓ рдЙрдарддреЗ рд╣реИрдВред рдкрджрд╛рд╡рдирдд / рдЕрдкреНрд░рдЪрд▓рд┐рдд рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдХрд╛рдо рдХрд░реЗрдВ? рдореБрдЭреЗ рдХреИрд╕реЗ рдкрддрд╛ рдЪрд▓реЗрдЧрд╛ рдХрд┐ рдХреМрди рд╕рд╛ рдбреЗрдЯрд╛ рдЕрдм рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ? рдЕрдзрд┐рдХрд╛рдВрд╢ рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЛ рддреЛрдбрд╝реЗ рдмрд┐рдирд╛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕реЗ рдбреЗрдЯрд╛ рдирд┐рдХрд╛рд▓рдирд╛ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рд╕реБрд░рдХреНрд╖рд┐рдд рдХреИрд╕реЗ рд╣реИ? рд╕рд╛рдорд╛рдиреНрдп HTTP рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рдЗрди рд╕рд╡рд╛рд▓реЛрдВ рдХрд╛ рдХреЛрдИ рдЬрд╡рд╛рдм рдирд╣реАрдВ рд╣реИред рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рд╣рдо рдЖрд╢рд╛рд╡рд╛рджреА рд╣реИрдВ рдФрд░ рдПрдкреАрдЖрдИ рд╕рд░рд▓ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ, рд╕реНрдерд┐рддрд┐ рдЗрддрдиреА рдЧрд░реНрдо рдирд╣реАрдВ рд▓рдЧрддреА рд╣реИред рдПрдкреАрдЖрдИ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреА рдпрд╣ рд╢реНрд░реЗрдгреА рдЖрдЧрдВрддреБрдХ рдХреЗ рд▓рд┐рдП рдЕрджреНрд╡рд┐рддреАрдп рдирд╣реАрдВ рд╣реИред рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдХрдВрдкрдирд┐рдпреЛрдВ рдХреЛ рдЙрдирд╕реЗ рдирд┐рдкрдЯрдирд╛ рдкрдбрд╝рд╛ред рдЕрдм рдПрдХ рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдорд╛рдзрд╛рди рдХреЛ рджреЗрдЦрдирд╛ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИред

GraphQLред рд╢реБрд░реБрдЖрдд


2012 рдореЗрдВ, рдПрдХ рдореЛрдмрд╛рдЗрд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ, рдлреЗрд╕рдмреБрдХ рдХреЛ рдЗрд╕реА рддрд░рд╣ рдХреА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛ред рдЗрдВрдЬреАрдирд┐рдпрд░ рд╕рд░реНрд╡рд░ рдкрд░ рдиреНрдпреВрдирддрдо рдореЛрдмрд╛рдЗрд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЙрд▓ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рдереЗ, рдЬрдмрдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдЪрд░рдг рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдХреЗрд╡рд▓ рдЖрд╡рд╢реНрдпрдХ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рдерд╛ рдФрд░ рдЙрдирдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХреБрдЫ рднреА рдирд╣реАрдВред рдЙрдирдХреЗ рдкреНрд░рдпрд╛рд╕реЛрдВ рдХрд╛ рдирддреАрдЬрд╛ рдерд╛, 2015 рдореЗрдВ рд░рд┐рдПрдХреНрдЯ рдХреЙрдиреНрдл рдХреЙрдиреНрдлреНрд░реЗрдВрд╕ рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдЧреНрд░рд╛рдлрдХреНрдпреВрдПрд▓ред GraphQL рдПрдХ рдХреНрд╡реЗрд░реА рд╡рд┐рд╡рд░рдг рднрд╛рд╖рд╛ рд╣реИ, рд╕рд╛рде рд╣реА рдЗрди рдкреНрд░рд╢реНрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд░рдирдЯрд╛рдЗрдо рд╡рд╛рддрд╛рд╡рд░рдг рднреА рд╣реИред



GraphQL рд╕рд░реНрд╡рд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред

рд╣рдо рдпреЛрдЬрдирд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ


GraphQL рдореЗрдВ рдбреЗрдЯрд╛ рд╕реНрдХреАрдорд╛ рдЙрдирдХреЗ рдмреАрдЪ рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдФрд░ рд╕рдВрдмрдВрдзреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдРрд╕рд╛ рдЬреЛрд░рджрд╛рд░ рддрд░реАрдХреЗ рд╕реЗ рдХрд░рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рд╕рд╛рдорд╛рдЬрд┐рдХ рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдореЙрдбрд▓ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВред User рдорд┐рддреНрд░реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирддрд╛ рд╣реИред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╢рд╣рд░ рдореЗрдВ рд░рд╣рддреЗ рд╣реИрдВ, рдФрд░ рд╢рд╣рд░ citizens рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдкрдиреЗ рдирд┐рд╡рд╛рд╕рд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирддрд╛ рд╣реИред рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдЧреНрд░рд╛рдл рдХрд╛ рдЧреНрд░рд╛рдл рдЧреНрд░рд╛рдл рдореЗрдВ рдХреНрдпрд╛ рд╣реИ:



рдмреЗрд╢рдХ, рдЧреНрд░рд╛рдл рдЙрдкрдпреЛрдЧреА рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рддрдерд╛рдХрдерд┐рдд "рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ" рднреА рдЖрд╡рд╢реНрдпрдХ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕ рддрд░рд╣ рдХреЗ рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ рдХреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдбреЗрдЯрд╛ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░реЗрдВ


рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдЧреНрд░рд╛рдлрдХреНрдпреВрдПрд▓ рдХреНрд╡реЗрд░реА рднрд╛рд╖рд╛ рдХрд╛ рд╕рд╛рд░ рдХреНрдпрд╛ рд╣реИред рд╣рдо рдЗрд╕ рднрд╛рд╖рд╛ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреНрд░рд╢реНрди рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдХрд░реЗрдВрдЧреЗ: "рд╡рд╛рдиреНрдпрд╛ рдпреВрдирд┐рдХреЙрд░реНрди рдирд╛рдо рд╡рд╛рд▓реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЙрд╕рдХреЗ рджреЛрд╕реНрддреЛрдВ рдХреЗ рдирд╛рдо, рд╕рд╛рде рд╣реА рд╕рд╛рде рд╢рд╣рд░ рдХрд╛ рдирд╛рдо рдФрд░ рдЬрдирд╕рдВрдЦреНрдпрд╛ рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдЬрд┐рд╕рдореЗрдВ рд╡рд╛рдиреНрдпрд╛ рд░рд╣рддреА рд╣реИ" :

 { user(name: "Vanya Unicorn") {   friends {     name   }   city {     name     population   } } } 

рдФрд░ рдпрд╣рд╛рдБ рдЧреНрд░рд╛рдлрдХреНрдпреВрдПрд▓ рд╕рд░реНрд╡рд░ рд╕реЗ рдЙрддреНрддрд░ рдЖрддрд╛ рд╣реИ:

 { "data": {   "user": {     "friends": [       { "name": "Lena" },       { "name": "Stas" }     ]     "city": {       "name": "Kyiv",       "population": 2928087     }   } } } 

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдлреЙрд░реНрдо рдХреЗ рд╕рд╛рде рдЕрдиреБрд░реЛрдз рдлрд╝реЙрд░реНрдо "рд╡реНрдпрдВрдЬрди" рдХреИрд╕рд╛ рд╣реИред рдПрдХ рднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреНрд╡реЗрд░реА рднрд╛рд╖рд╛ JSON рдХреЗ рд▓рд┐рдП рдмрдирд╛рдИ рдЧрдИ рдереАред рдордЬрдмреВрдд рдЯрд╛рдЗрдкрд┐рдВрдЧ рдХреЗ рд╕рд╛рдеред рдФрд░ рдпрд╣ рд╕рдм рдПрдХ HTTP POST рдЕрдиреБрд░реЛрдз рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рд╕рд░реНрд╡рд░ рдХреЛ рдХрдИ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИред рдЖрдЗрдП рдЧреНрд░рд╛рдлрдХреЙрд▓ рд╕рд░реНрд╡рд░ рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ рдХрдВрд╕реЛрд▓ рдЦреЛрд▓реЗрдВ, рдЬрд┐рд╕реЗ рдЧреНрд░рд╛рдл рдЖрдИ рдХреНрдпреВрдПрд▓ ("рдЧреНрд░рд╛рдл") рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдПрдХ рдЯреЛрдХрд░реА рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЕрдиреБрд░реЛрдз рдХреЛ рдкреВрд░рд╛ рдХрд░реВрдВрдЧрд╛: тАЬрдореИрдВ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ 1 рджреНрд╡рд╛рд░рд╛ рдПрдХ рдЯреЛрдХрд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдореБрдЭреЗ рдЗрд╕ рдЯреЛрдХрд░реА рдФрд░ рдЙрддреНрдкрд╛рдж рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╕рднреА рдкрджреЛрдВ рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИред рдЬрд╛рдирдХрд╛рд░реА рд╕реЗ, рдирд╛рдо, рдореВрд▓реНрдп, рд╕реВрдЪреА рд╕рдВрдЦреНрдпрд╛ рдФрд░ рдЪрд┐рддреНрд░ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИрдВ (рдФрд░ рдХреЗрд╡рд▓ рдкрд╣рд▓реЗ)ред рдореБрдЭреЗ рдЗрди рдЙрддреНрдкрд╛рджреЛрдВ рдХреА рдорд╛рддреНрд░рд╛ рдореЗрдВ рднреА рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИ, рдЙрдирдХреА рдХреАрдордд рдФрд░ рдЯреЛрдХрд░реА рдореЗрдВ рдХреБрд▓ рд▓рд╛рдЧрдд рдХреНрдпрд╛ рд╣реИ ред "

 { cart(id: 1) {   items {     product {       title       price       sku       images(limit: 1)     }     quantity     total   }   subTotal } } 

рдЕрдиреБрд░реЛрдз рдХреЗ рд╕рдлрд▓ рд╕рдорд╛рдкрди рдХреЗ рдмрд╛рдж, рд╣рдореЗрдВ рд╡рд╣реА рдорд┐рд▓рддрд╛ рд╣реИ рдЬреЛ рдкреВрдЫрд╛ рдЧрдпрд╛ рдерд╛:



рдореБрдЦреНрдп рд▓рд╛рдн


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

рдЖрдЬ, рдЧреНрд░рд╛рдлрд╝рд┐рдХрд▓ рд╕рд░реНрд╡рд░ рд▓рдЧрднрдЧ рдХрд┐рд╕реА рднреА рднрд╛рд╖рд╛ рдореЗрдВ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред GraphQL рд╕рд░реНрд╡рд░ рдХрд╛ рд╕рдмрд╕реЗ рдкреВрд░реНрдг рд╕рдВрд╕реНрдХрд░рдг, рдиреЛрдб рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдХреЗ рд▓рд┐рдП GraphQL.js рд╣реИред рдЬрд╛рд╡рд╛ рд╕рдореБрджрд╛рдп рдореЗрдВ, рд╕рдВрджрд░реНрдн рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЧреНрд░рд╛рдлрдХреЙрд▓ рдЬрд╛рд╡рд╛ рд╣реИ ред

GraphQL рдПрдкреАрдЖрдИ рдмрдирд╛рдПрдБ


рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдПрдХ рдареЛрд╕ рдЬреАрд╡рди рдЙрджрд╛рд╣рд░рдг рдкрд░ рдПрдХ рдЧреНрд░рд╛рдлрдХреНрдпреВрдПрд▓ рд╕рд░реНрд╡рд░ рдХреИрд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рдПред

рджреЛ рдШрдЯрдХреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ microservice рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдПрдХ рдСрдирд▓рд╛рдЗрди рд╕реНрдЯреЛрд░ рдХреЗ рд╕рд░рд▓реАрдХреГрдд рд╕рдВрд╕реНрдХрд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:

  • рдХрд╕реНрдЯрдо рдЯреЛрдХрд░реА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реА рдХрд╛рд░реНрдЯ рд╕реЗрд╡рд╛ред рдбреЗрдЯрд╛ рдХреЛ рдПрдХ рд░рд┐рд▓реЗрд╢рдирд▓ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдбреЗрдЯрд╛ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП SQL рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдмрд╣реБрдд рд╕рд░рд▓ рдЬрд╛рджреВ рдХреЗ рдмрд┐рдирд╛ рдмрд╣реБрдд рд╕рд░рд▓ рд╕реЗрд╡рд╛ :)
  • рдЙрддреНрдкрд╛рдж-рд╕реЗрд╡рд╛ рдЙрддреНрдкрд╛рдж рдХреИрдЯрд▓реЙрдЧ рддрдХ рдкрд╣реБрдВрдЪ рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИ, рдЬрд┐рд╕рд╕реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЯреЛрдХрд░реА рднрд░ рдЬрд╛рддреА рд╣реИред рдЙрддреНрдкрд╛рдж рдбреЗрдЯрд╛ рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ HTTP рдПрдкреАрдЖрдИ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред

рджреЛрдиреЛрдВ рд╕реЗрд╡рд╛рдУрдВ рдХреЛ рдХреНрд▓рд╛рд╕рд┐рдХ рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреВрдЯ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рднреА рдмреБрдирд┐рдпрд╛рджреА рддрд░реНрдХ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред



рд╣рдо рдХрд╛рд░реНрдЯ рд╕реЗрд╡рд╛ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ GraphQL рдПрдкреАрдЖрдИ рдмрдирд╛рдиреЗ рдХрд╛ рдЗрд░рд╛рджрд╛ рд░рдЦрддреЗ рд╣реИрдВред рдпрд╣ рдПрдкреАрдЖрдИ рдЯреЛрдХрд░реА рдбреЗрдЯрд╛ рдФрд░ рдЗрд╕рдореЗрдВ рдЬреЛрдбрд╝реЗ рдЧрдП рдЙрддреНрдкрд╛рджреЛрдВ рддрдХ рдкрд╣реБрдВрдЪ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдкрд╣рд▓рд╛ рд╕рдВрд╕реНрдХрд░рдг


Java рдЗрдХреЛрд╕рд┐рд╕реНрдЯрдо рдХреЗ рд▓рд┐рдП GraphQL рд╕рдВрджрд░реНрдн рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди, рдЬрд┐рд╕рдХрд╛ рд╣рдордиреЗ рдкрд╣рд▓реЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдерд╛ - GraphQL рдЬрд╛рд╡рд╛, рд╣рдорд╛рд░реА рдорджрдж рдХрд░реЗрдЧрд╛ред

рдХреБрдЫ рдирд┐рд░реНрднрд░рддрд╛ pom.xml: рдЬреЛрдбрд╝реЗрдВ pom.xml:

 <dependency>   <groupId>com.graphql-java</groupId>   <artifactId>graphql-java</artifactId>   <version>9.3</version> </dependency> <dependency>   <groupId>com.graphql-java</groupId>   <artifactId>graphql-java-tools</artifactId>   <version>5.2.4</version> </dependency> <dependency>   <groupId>com.graphql-java</groupId>   <artifactId>graphql-spring-boot-starter</artifactId>   <version>5.0.2</version> </dependency> <dependency>   <groupId>com.graphql-java</groupId>   <artifactId>graphiql-spring-boot-starter</artifactId>   <version>5.0.2</version> </dependency> 

рдкрд╣рд▓реЗ рдмрддрд╛рдП рдЧрдП graphql-java рд╣рдореЗрдВ graphql-java-tools, рдПрдХ graphql-java-tools, рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд╕рд╛рде-рд╕рд╛рде рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреВрдЯ "рд╕реНрдЯрд╛рд░реНрдЯрд░реНрд╕" рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдЬреЛ рдХрд┐ рдЧреНрд░рд╛рдлрдХреЙрд▓ рд╕рд░реНрд╡рд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рдЪрд░рдгреЛрдВ рдХреЛ рдмрд╣реБрдд рд╕рд░рд▓ рдХрд░реЗрдЧрд╛:

  • рдЧреНрд░рд╛рдлрдХрд▓-рд╕реНрдкреНрд░рд┐рдВрдЧ-рдмреВрдЯ-рд╕реНрдЯрд╛рд░реНрдЯрд░, рдЧреНрд░рд╛рдлрд╝рд┐рдХрд▓ рдЬрд╛рд╡рд╛ рдХреЛ рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреВрдЯ рд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рддрдВрддреНрд░ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ;
  • graphiql- рд╡рд╕рдВрдд-рдмреВрдЯ-рд╕реНрдЯрд╛рд░реНрдЯрд░ рдЧреНрд░рд╛рдлрдХреНрд▓рд╛рдЗрди рдкреНрд░рд╢реНрдиреЛрдВ рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЗрдВрдЯрд░реИрдХреНрдЯрд┐рд╡ рдЧреНрд░рд╛рдл i QL рд╡реЗрдм рдХрдВрд╕реЛрд▓ рдЬреЛрдбрд╝рддрд╛ рд╣реИред

рдЕрдЧрд▓рд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХрджрдо рдЧреНрд░рд╛рдлрдХреЙрд▓ рд╕реЗрд╡рд╛ рдпреЛрдЬрдирд╛, рд╣рдорд╛рд░реЗ рдЧреНрд░рд╛рдл рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдХрд░рдирд╛ рд╣реИред рдЗрд╕ рдЧреНрд░рд╛рдлрд╝ рдХреЗ рдиреЛрдбреНрд╕ рдХреЛ рдЦреЗрддреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ , рдФрд░ рдХрд┐рдирд╛рд░реЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдПрдХ рдЦрд╛рд▓реА рдЧреНрд░рд╛рдлрд╝ рдкрд░рд┐рднрд╛рд╖рд╛ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддреА рд╣реИ:

 schema { } 

рдЗрд╕ рдпреЛрдЬрдирд╛ рдореЗрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдкрдХреЛ рдпрд╛рдж рд╣реИ, "рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ" рдпрд╛ рд╢реАрд░реНрд╖ рд╕реНрддрд░ рдХреЗ рдкреНрд░рд╢реНрди рд╣реИрдВред рдЙрдиреНрд╣реЗрдВ рд╕реНрдХреАрдорд╛ рдореЗрдВ рдХреНрд╡реЗрд░реА рдлрд╝реАрд▓реНрдб рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред EntryPoints рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВ:

 schema { query: EntryPoints } 

рд╣рдо рдЗрд╕реЗ рдкрд╣рд▓реЗ рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдПрдХ рдЯреЛрдХрд░реА рдЦреЛрдЬ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ:

 type EntryPoints { cart(id: Long!): Cart } 

рдЧреНрд░рд╛рдлрдХреНрд▓рд╛рдЗрди рд╢рдмреНрджреЛрдВ рдореЗрдВ рдХрд╛рд░реНрдЯ рдПрдХ рдлреАрд▓реНрдб рд╕реЗ рдЬреНрдпрд╛рджрд╛ рдХреБрдЫ рдирд╣реАрдВ рд╣реИред id рдЗрд╕ рдХреНрд╖реЗрддреНрд░ рдХрд╛ рдПрдХ рдорд╛рдкрдХ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╕реНрдХреЗрд▓рд░ рдЯрд╛рдЗрдк Long ред рд╡рд┐рд╕реНрдордпрд╛рджрд┐рдмреЛрдзрдХ рдЪрд┐рд╣реНрди ! рдкреНрд░рдХрд╛рд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдкреИрд░рд╛рдореАрдЯрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдпрд╣ рдкрд╣рдЪрд╛рди рдХрд░рдиреЗ рдФрд░ Cart рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реИ:

 type Cart { id: Long! items: [CartItem!]! subTotal: BigDecimal! } 

рдорд╛рдирдХ id рдЕрд▓рд╛рд╡рд╛, рдЯреЛрдХрд░реА рдореЗрдВ рдЗрд╕рдХреЗ рдЖрдЗрдЯрдо рддрддреНрд╡ рдФрд░ рд╕рднреА subTotal рдЙрддреНрдкрд╛рджреЛрдВ рдХреЗ рд▓рд┐рдП рд░рд╛рд╢рд┐ рд╢рд╛рдорд┐рд▓ рд╣реИред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЖрдЗрдЯрдо рдХреЛ рдПрдХ рд╕реВрдЪреА рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рд╡рд░реНрдЧ рдХреЛрд╖реНрдардХ рджреНрд╡рд╛рд░рд╛ рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ [] ред рдЗрд╕ рд╕реВрдЪреА рдХреЗ рддрддреНрд╡ CartItem рдкреНрд░рдХрд╛рд░ рд╣реИрдВред рдлрд╝реАрд▓реНрдб рдкреНрд░рдХрд╛рд░ рдХреЗ рдирд╛рдо рдХреЗ рдмрд╛рдж рд╡рд┐рд╕реНрдордпрд╛рджрд┐рдмреЛрдзрдХ рдЪрд┐рд╣реНрди рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ ! рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдлрд╝реАрд▓реНрдб рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рд╕рд░реНрд╡рд░ рдЗрд╕ рдХреНрд╖реЗрддреНрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдЧреИрд░-рд░рд┐рдХреНрдд рдорд╛рди рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╣рдордд рд╣реИ, рдЕрдЧрд░ рдХреЛрдИ рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рдпрд╣ CartItem рдкреНрд░рдХрд╛рд░ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд░рд╣рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдЙрддреНрдкрд╛рдж ( productId ) рдХрд╛ рд▓рд┐рдВрдХ рд╢рд╛рдорд┐рд▓ рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕реЗ рдХрд┐рддрдиреА рдмрд╛рд░ рдЯреЛрдХрд░реА ( quantity ) рдФрд░ рдЙрддреНрдкрд╛рдж рдХреА рдорд╛рддреНрд░рд╛, рд╕рдВрдЦреНрдпрд╛ ( total ) рдкрд░ рдкрд░рд┐рдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

 type CartItem { productId: String! quantity: Int! total: BigDecimal! } 

рдпрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИ - рдЕрджрд┐рд╢ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рднреА рдХреНрд╖реЗрддреНрд░ рдЕрдирд┐рд╡рд╛рд░реНрдп рд╣реИрдВред

рдЗрд╕ рдпреЛрдЬрдирд╛ рдХреЛ рд╕рдВрдпреЛрдЧ рд╕реЗ рдирд╣реАрдВ рдЪреБрдирд╛ рдЧрдпрд╛ рдерд╛ред рдХрд╛рд░реНрдЯ рд╕реЗрд╡рд╛ рдиреЗ рдХрд╛рд░реНрдЯ рдмрд╛рд╕реНрдХреЗрдЯ рдФрд░ рдЗрд╕рдХреЗ CartItem рддрддреНрд╡реЛрдВ рдХреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЙрд╕реА рдХреНрд╖реЗрддреНрд░ рдХреЗ рдирд╛рдо рдФрд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рд╣реИ рдЬреИрд╕рд╛ рдХрд┐ рдЧреНрд░рд╛рдлрд▓рд╛рдЗрди рд╕реНрдХреАрдорд╛ рдореЗрдВ рд╣реИред рдХрд╛рд░реНрдЯ рдореЙрдбрд▓ рдСрдЯреЛ-рдЬрдирд░реЗрдЯрд┐рдВрдЧ рдЧреЗрдЯрд░реНрд╕ / рд╕реЗрдЯрд░, рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдФрд░ рдЕрдиреНрдп рддрд░реАрдХреЛрдВ рдХреЗ рд▓рд┐рдП рд▓реЛрдореНрдмреЛрдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред JPA рдХрд╛ рдЙрдкрдпреЛрдЧ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рджреГрдврд╝рддрд╛ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

Cart рдХреНрд▓рд╛рд╕:

 import lombok.Data; import javax.persistence.*; import java.math.BigDecimal; import java.util.ArrayList; import java.util.List; @Entity @Data public class Cart {   @Id   @GeneratedValue   private Long id;   @ElementCollection(fetch = FetchType.EAGER)   private List<CartItem> items = new ArrayList<>();   public BigDecimal getSubTotal() {       return getItems().stream()               .map(Item::getTotal)               .reduce(BigDecimal.ZERO, BigDecimal::add);   } } 

CartItem рдХреНрд▓рд╛рд╕:

 import lombok.AllArgsConstructor; import lombok.Data; import javax.persistence.Column; import javax.persistence.Embeddable; import java.math.BigDecimal; @Embeddable @Data @AllArgsConstructor public class CartItem {   @Column(nullable = false)   private String productId;   @Column(nullable = false)   private int quantity;   @Column(nullable = false)   private BigDecimal total; } 

рддреЛ, рдмрд╛рд╕реНрдХреЗрдЯ ( Cart ) рдФрд░ рдмрд╛рд╕реНрдХреЗрдЯ рдПрд▓рд┐рдореЗрдВрдЯреНрд╕ ( CartItem ) рдХреЛ рдЧреНрд░рд╛рдлрдХреНрдпреВрдПрд▓ рдЖрд░реЗрдЦ рдФрд░ рдХреЛрдб рджреЛрдиреЛрдВ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдЦреЗрддреЛрдВ рдФрд░ рдЙрдирдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕реЗрдЯ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдПрдХ-рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рде "рд╕рдВрдЧрдд" рд╣реИрдВред рд▓реЗрдХрд┐рди рдпрд╣ рдЕрднреА рднреА рд╣рдорд╛рд░реА рд╕реЗрд╡рд╛ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИред

рд╣рдореЗрдВ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ " cart(id: Long!): Cart " рдХреИрд╕реЗ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЧреНрд░рд╛рдлрдХреНрд▓рд┐рдРрдХрдПрдВрдбрдУрд╡рд░ рдХреЗ рдмреАрди рдХреЗ рд╕рд╛рде рд╕реНрдкреНрд░рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрддреНрдпрдВрдд рд╕рд░рд▓ рдЬрд╛рд╡рд╛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдмрдирд╛рдПрдВред GraphQLQueryResolver рд╕рд┐рд░реНрдл рд╕реНрдХреАрдорд╛ рдореЗрдВ "рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ" рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИред рд╣рдо рдПрдВрдЯреНрд░реА рдкреЙрдЗрдВрдЯ ( cart ) рдореЗрдВ рдлрд╝реАрд▓реНрдб рдХреЗ рд╕рдорд╛рди рдПрдХ рдирд╛рдо рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд┐рдзрд┐ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕реЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдкреНрд░рдХрд╛рд░ рд╕реЗ рд╕рдВрдЧрдд рдмрдирд╛рддреЗ рд╣реИрдВ, рдФрд░ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдЙрд╕реА рдХрд╛рд░реНрдЯ рдХреЛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП cartService рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ:

 @Bean public GraphQLQueryResolver queryResolver() {   return new GraphQLQueryResolver () {       public Cart cart(Long id) {           return cartService.findCart(id);       }   } } 

рдпреЗ рдмрджрд▓рд╛рд╡ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИрдВред рдЧреНрд░рд╛рдлрд┐рдЗрдХреНрдпреВ рдХрдВрд╕реЛрд▓ рдореЗрдВ рдХрд╛рд░реНрдЯ рд╕реЗрд╡рд╛ рдХреЛ рдкреБрдирд░рд╛рд░рдВрдн рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреНрд╡реЗрд░реА рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрдЧреА:

 { cart(id: 1) {   items {     productId     quantity     total   }   subTotal } } 

рдЯрд┐рдкреНрдкрдгреА


  • рд╣рдо рд╕реНрдХреЗрд▓рд░ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдЯреЛрдХрд░реА рдФрд░ рдЙрддреНрдкрд╛рдж рдХреЗ рд▓рд┐рдП рдЕрджреНрд╡рд┐рддреАрдп рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ Long рдФрд░ String ред рдЗрд╕ рддрд░рд╣ рдХреЗ рдкреНрд░рдпреЛрдЬрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реИ рдЧреНрд░рд╛рдлрд┐рдХрд▓ - ID ред рд╢рдмреНрджрд╛рд░реНрде, рдпрд╣ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдПрдкреАрдЖрдИ рдХреЗ рд▓рд┐рдП рдПрдХ рдмреЗрд╣рддрд░ рд╡рд┐рдХрд▓реНрдк рд╣реИред рдХреИрд╢рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЯрд╛рдЗрдк ID рдореВрд▓реНрдпреЛрдВ рдХреЛ рдПрдХ рдХреБрдВрдЬреА рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
  • рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдХреЗ рд╡рд┐рдХрд╛рд╕ рдореЗрдВ рдЗрд╕ рд╕реНрддрд░ рдкрд░, рдЖрдВрддрд░рд┐рдХ рдФрд░ рдмрд╛рд╣рд░реА рдбреЛрдореЗрди рдореЙрдбрд▓ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдорд╛рди рд╣реИрдВред рд╣рдо Cart рдФрд░ Cart CartItem рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рдЙрдирдХрд╛ рд╕реАрдзрд╛ рдЙрдкрдпреЛрдЧ рдЧреНрд░рд╛рдлрдХреЙрд▓ рд░рд┐рд╕реЛрд▓реНрд╡рд░ рдореЗрдВ рд╣реИред рдпреБрджреНрдз рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ, рдЗрди рдореЙрдбрд▓реЛрдВ рдХреЛ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХреА рдЬрд╛рддреА рд╣реИред GraphQL рд░рд┐рдЬрд╝реЙрд▓реНрд╡рд░ рдХреЗ рд▓рд┐рдП, рдЖрдВрддрд░рд┐рдХ рд╡рд┐рд╖рдп рдХреНрд╖реЗрддреНрд░ рд╕реЗ рдЕрд▓рдЧ рдПрдХ рдореЙрдбрд▓ рдореМрдЬреВрдж рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдПрдкреАрдЖрдИ рдХреЛ рдЙрдкрдпреЛрдЧреА рдмрдирд╛рдирд╛


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

 type Product { id: String! title: String! price: BigDecimal! description: String sku: String! images: [String!]! } 

CartItem рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдлрд╝реАрд▓реНрдб рдЬреЛрдбрд╝реЗрдВ, рдФрд░ CartItem рдХреНрд╖реЗрддреНрд░ рдХреЛ productId рд░реВрдк рдореЗрдВ productId :

 type Item { quantity: Int! product: Product! productId: String! @deprecated(reason: "don't use it!") total: BigDecimal! } 

рд╣рдордиреЗ рдпреЛрдЬрдирд╛ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдпрд╛ред рдФрд░ рдЕрдм рдпрд╣ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реИ рдХрд┐ product рдХреНрд╖реЗрддреНрд░ рдХреЗ рд▓рд┐рдП рдЪрдпрди рдХреИрд╕реЗ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред рд╣рдо рдкрд╣рд▓реЗ Cart рдФрд░ Cart CartItem рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рддреЗ рдереЗ, рдЬреЛ рдЧреНрд░рд╛рдлрд▓рд╛рдЗрди рдЬрд╛рд╡рд╛ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдорд╛рдиреЛрдВ рдХреЛ рдмрд╛рдВрдзрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рдерд╛ред рд▓реЗрдХрд┐рди рдпрд╣рд╛рдБ рдпрд╣ рдпрд╛рдж рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╕рд┐рд░реНрдл CartItem рд╡рд░реНрдЧ рдореЗрдВ product рдЧреБрдг рдирд╣реАрдВ рд╣реИ:

 @Embeddable @Data @AllArgsConstructor public class CartItem {   @Column(nullable = false)   private String productId;   @Column(nullable = false)   private int quantity;   @Column(nullable = false)   private BigDecimal total; } 

рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╡рд┐рдХрд▓реНрдк рд╣реИ:

  1. CartItem рдореЗрдВ рдЙрддреНрдкрд╛рдж рдЧреБрдг рдЬреЛрдбрд╝реЗрдВ рдФрд░ рдЙрддреНрдкрд╛рдж рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ "рдХреИрд╕реЗ рд╕рд┐рдЦрд╛рдПрдВ";
  2. рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВ рдХрд┐ рдХрд╛рд░реНрдЯрд┐рдЗрдо рд╡рд░реНрдЧ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рдмрд┐рдирд╛ рдЙрддреНрдкрд╛рдж рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред

рджреВрд╕рд░рд╛ рддрд░реАрдХрд╛ рдмреЗрд╣рддрд░ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЖрдВрддрд░рд┐рдХ рдбреЛрдореЗрди ( CartItem рд╡рд░реНрдЧ) рдХреЗ рд╡рд┐рд╡рд░рдг рдХрд╛ рдореЙрдбрд▓ рдЧреНрд░рд╛рдл i QL рдПрдкреАрдЖрдИ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЗ рд╕рд╛рде рдХрд╡рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдЗрд╕ рд▓рдХреНрд╖реНрдп рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЧреНрд░рд╛рдлрдХреИрд▓рд┐рд╕реНрдХреЙрд▓реНрд╡рд░ рдорд╛рд░реНрдХрд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдорджрдж рдХрд░реЗрдЧрд╛ред рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╕реЗ, рдЖрдк рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдпрд╛ рдУрд╡рд░рд░рд╛рдЗрдб) рдХрд┐ рдЯрд╛рдЗрдк T рд▓рд┐рдП рдлрд╝реАрд▓реНрдб рдорд╛рди рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ T рд╡рд╕рдВрдд рд╡рд┐рдиреНрдпрд╛рд╕ рдореЗрдВ рдЗрд╕реА рд╕реЗрдо рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

 @Bean public GraphQLResolver<CartItem> cartItemResolver() {   return new GraphQLResolver<CartItem>() {       public Product product(CartItem item) {           return http.getForObject("http://localhost:9090/products/{id}",                   Product.class,                   item.getProductId());       }   }; } 

product рд╡рд┐рдзрд┐ рдХрд╛ рдирд╛рдо рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдирд╣реАрдВ рд╣реИред GraphQL рдЬрд╛рд╡рд╛ рдХреНрд╖реЗрддреНрд░ рдХреЗ рдирд╛рдо рд╕реЗ рдбреЗрдЯрд╛ рдбрд╛рдЙрдирд▓реЛрдбрд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреА рддрд▓рд╛рд╢ рдореЗрдВ рд╣реИ, рдФрд░ рд╣рдореЗрдВ рдХреЗрд╡рд▓ product рдХреНрд╖реЗрддреНрд░ рдХреЗ рд▓рд┐рдП рд▓реЛрдбрд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ! рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЯрд╛рдЗрдк рдХреА рдЧрдИ CartItem рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдЙрд╕ рд╕рдВрджрд░реНрдн рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЙрддреНрдкрд╛рдж рдХрд╛ рдЪрдпрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЖрдЧреЗ рддрдХрдиреАрдХ рдХрд╛ рдорд╛рдорд▓рд╛ рд╣реИред RestTemplate рдЬреИрд╕реЗ http рдХреНрд▓рд╛рдЗрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ RestTemplate рд╣рдо рдЙрддреНрдкрд╛рдж рд╕реЗрд╡рд╛ рдХреЗ рд▓рд┐рдП рдПрдХ GET рдЕрдиреБрд░реЛрдз рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдкрд░рд┐рдгрд╛рдо рдХреЛ Product рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:

 @Data public class Product {   private String id;   private String title;   private BigDecimal price;   private String description;   private String sku;   private List<String> images; } 

рдЗрди рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рдЕрдзрд┐рдХ рджрд┐рд▓рдЪрд╕реНрдк рдирдореВрдиреЗ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрд┐рд╕рдореЗрдВ рдЯреЛрдХрд░реА рдФрд░ рдЗрд╕рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝реЗ рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдЙрддреНрдкрд╛рджреЛрдВ рдХреЗ рдмреАрдЪ рдХрд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдВрдмрдВрдз рд╢рд╛рдорд┐рд▓ рд╣реИред

рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдкреБрдирд░рд╛рд░рдВрдн рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдк рдЧреНрд░рд╛рдл I QL рдХрдВрд╕реЛрд▓ рдореЗрдВ рдПрдХ рдирдИ рдХреНрд╡реЗрд░реА рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

 { cart(id: 1) {   items {     product {       title       price       sku       images     }     quantity     total   }   subTotal } } 

рдФрд░ рдпрд╣рд╛рдБ рдХреНрд╡реЗрд░реА рдирд┐рд╖реНрдкрд╛рджрди рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реИ:



рд╣рд╛рд▓рд╛рдБрдХрд┐ productId @deprecated рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд productId рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рдХреНрд╖реЗрддреНрд░ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рд╢реНрди рдХрд╛рдо рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦреЗрдВрдЧреЗред рд▓реЗрдХрд┐рди рдЧреНрд░рд╛рдл I QL рдХрдВрд╕реЛрд▓ рдРрд╕реЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рдд: рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдФрд░ рд╡рд┐рд╢реЗрд╖ рддрд░реАрдХреЗ рд╕реЗ рдЙрдирдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░реЗрдЧрд╛:



рдпрд╣ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдПрдХреНрд╕рдкреНрд▓реЛрд░рд░, рдЧреНрд░рд╛рдлрд╝ рдЖрдИ рдХреНрдпреВрдПрд▓ рдХрдВрд╕реЛрд▓ рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЛ рджрд┐рдЦрд╛рдиреЗ рдХрд╛ рд╕рдордп рд╣реИ, рдЬреЛ рдЧреНрд░рд╛рдлрдХрд╛рдЗ рд╕реНрдХреАрдорд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рд╕рднреА рдкрд░рд┐рднрд╛рд╖рд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред CartItem рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдПрдХреНрд╕рдкреНрд▓реЛрд░рд░ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:



рд▓реЗрдХрд┐рди рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд╡рд╛рдкрд╕ред рдкрд╣рд▓реЗ рд╣реА рдбреЗрдореЛ рдХреЗ рд╕рдорд╛рди рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд▓реМрдЯреЗ рдЪрд┐рддреНрд░реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд▓рд┐рдП рдЕрднреА рднреА рдкрд░реНрдпрд╛рдкреНрдд рд╕реАрдорд╛ рдирд╣реАрдВ рд╣реИред рджрд░рдЕрд╕рд▓, рдПрдХ рдЯреЛрдХрд░реА рдХреЗ рд▓рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдкреНрд░рддреНрдпреЗрдХ рдЙрддреНрдкрд╛рдж рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ рдЫрд╡рд┐ рдЪрд╛рд╣рд┐рдП:

 images(limit: 1) 

рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпреЛрдЬрдирд╛ рдмрджрд▓реЗрдВ рдФрд░ рдЙрддреНрдкрд╛рдж рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдЪрд┐рддреНрд░ рдлрд╝реАрд▓реНрдб рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдЬреЛрдбрд╝реЗрдВ:

 type Product { id: ID! title: String! price: BigDecimal! description: String sku: String! images(limit: Int = 0): [String!]! } 

рдФрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛрдб рдореЗрдВ рд╣рдо рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ GraphQLResolver, рдХреЗрд╡рд▓ рдЗрд╕ рдмрд╛рд░ рдЯрд╛рдЗрдк рдХрд░рдХреЗ Product:

 @Bean public GraphQLResolver<Product> productResolver() {   return new GraphQLResolver<Product>() {       public List<String> images(Product product, int limit) {           List<String> images = product.getImages();           int normalizedLimit = limit > 0 ? limit : images.size();           return images.subList(0, Math.min(normalizedLimit, images.size()));       }   }; } 

рдлрд┐рд░ рд╕реЗ рдореИрдВ рдЗрд╕ рддрдереНрдп рдкрд░ рдзреНрдпрд╛рди рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рд╡рд┐рдзрд┐ рдХрд╛ рдирд╛рдо рдЖрдХрд╕реНрдорд┐рдХ рдирд╣реАрдВ рд╣реИ: рдпрд╣ рдХреНрд╖реЗрддреНрд░ рдХреЗ рдирд╛рдо рдХреЗ рд╕рд╛рде рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ imagesред рд╕рдВрджрд░реНрдн рдСрдмреНрдЬреЗрдХреНрдЯ ProductрдЫрд╡рд┐рдпреЛрдВ рддрдХ рдкрд╣реБрдВрдЪ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдФрд░ limitрд╕реНрд╡рдпрдВ рдХреНрд╖реЗрддреНрд░ рдХрд╛ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИред

рдпрджрд┐ рдХреНрд▓рд╛рдЗрдВрдЯ рдиреЗ рдореВрд▓реНрдп рдХреЗ рд░реВрдк рдореЗрдВ рдХреБрдЫ рднреА рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ limit, рддреЛ рд╣рдорд╛рд░реА рд╕реЗрд╡рд╛ рдЙрддреНрдкрд╛рдж рдХреА рд╕рднреА рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░ рджреЗрдЧреАред рдпрджрд┐ рдЧреНрд░рд╛рд╣рдХ рдиреЗ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдореВрд▓реНрдп рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рд╕реЗрд╡рд╛ рдмрд┐рд▓реНрдХреБрд▓ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧреА (рд▓реЗрдХрд┐рди рдЙрддреНрдкрд╛рдж рдореЗрдВ рдХреЛрдИ рднреА рдЕрдзрд┐рдХ рдирд╣реАрдВ рд╣реИ)ред

рд╣рдо рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╕рд░реНрд╡рд░ рдХреЗ рдкреБрдирд░рд╛рд░рдВрдн рд╣реЛрдиреЗ рддрдХ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реИрдВред рдХрдВрд╕реЛрд▓ рдореЗрдВ рд╕рд░реНрдХрд┐рдЯ рдХреЛ рдкреБрдирд░рд╛рд░рдВрдн рдХрд░рдирд╛ рдФрд░ рдЕрдиреБрд░реЛрдз рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдирд╛, рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдПрдХ рдкреВрд░реНрдг рдЕрдиреБрд░реЛрдз рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

 { cart(id: 1) {   items {     product {       title       price       sku       images(limit: 1)     }     quantity     total   }   subTotal } } 

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

рдХреЛрдб- First рдФрд░ GraphQL SPQR рджреГрд╖реНрдЯрд┐рдХреЛрдг


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

рдЧреНрд░рд╛рдлрдХреНрд▓реАрди рдЬрд╛рд╡рд╛ рдХреА рдХреЗрд╡рд▓ рдореВрд▓ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд╣реА рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИрдВ, рд╣рдореЗрдВ рдЧреНрд░рд╛рдлрдХреИрд▓ рдПрд╕рдкреАрдХреНрдпреВрдЖрд░ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдЕрдЪреНрдЫреА рдЦрдмрд░ рдпрд╣ рд╣реИ рдХрд┐ рдЧреНрд░рд╛рдлрдХреНрдпреВрдПрд▓ рдПрд╕рдкреАрдХреНрдпреВрдЖрд░ рдЧреНрд░рд╛рдлрдХреЙрд▓ рдЬрд╛рд╡рд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдРрдб-рдСрди рд╣реИ, рдФрд░ рдЬрд╛рд╡рд╛ рдореЗрдВ рдЧреНрд░рд╛рдлрдХреЙрд▓ рд╕рд░реНрд╡рд░ рдХрд╛ рд╡реИрдХрд▓реНрдкрд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдирд╣реАрдВ рд╣реИред

рд╡рд╛рдВрдЫрд┐рдд рдирд┐рд░реНрднрд░рддрд╛ рдЗрд╕рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ pom.xml:

 <dependency>   <groupId>io.leangen.graphql</groupId>   <artifactId>spqr</artifactId>   <version>0.9.8</version> </dependency> 

рдпрд╣рд╛рдВ рд╡рд╣ рдХреЛрдб рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬреЛ рдмрд╛рд╕реНрдХреЗрдЯ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рдЧреНрд░рд╛рдлрдХреНрдпреВрдПрд▓ SPQR- рдЖрдзрд╛рд░рд┐рдд рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ:

 @Component public class CartGraph {   private final CartService cartService;   @Autowired   public CartGraph(CartService cartService) {       this.cartService = cartService;   }   @GraphQLQuery(name = "cart")   public Cart cart(@GraphQLArgument(name = "id") Long id) {       return cartService.findCart(id);   } } 

рдФрд░ рдЙрддреНрдкрд╛рдж рдХреЗ рд▓рд┐рдП:

 @Component public class ProductGraph {   private final RestTemplate http;   @Autowired   public ProductGraph(RestTemplate http) {       this.http = http;   }   @GraphQLQuery(name = "product")   public Product product(@GraphQLContext CartItem cartItem) {       return http.getForObject(               "http://localhost:9090/products/{id}",               Product.class,               cartItem.getProductId()       );   }   @GraphQLQuery(name = "images")   public List<String> images(@GraphQLContext Product product,                              @GraphQLArgument(name = "limit", defaultValue = "0") int limit) {       List<String> images = product.getImages();       int normalizedLimit = limit > 0 ? limit : images.size();       return images.subList(0, Math.min(normalizedLimit, images.size()));   } } 

рдлрд╝реАрд▓реНрдб рд▓реЛрдбрд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдлрд╝реНрд▓реИрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП @GraphQLQuery рдПрдиреЛрдЯреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдПрдиреЛрдЯреЗрд╢рди @GraphQLContextрдХреНрд╖реЗрддреНрд░ рдХреЗ рд▓рд┐рдП рдЪрдпрди рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред рдФрд░ рдПрдиреЛрдЯреЗрд╢рди @GraphQLArgumentрд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рддрд░реНрдХ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рддрд╛ рд╣реИред рдпреЗ рд╕рднреА рдПрдХ рддрдВрддреНрд░ рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рд╣реИрдВ рдЬреЛ рдЧреНрд░рд╛рдлрд┐рдХрд╛ SPQR рдХреЛ рдПрдХ рд╕реНрдХреАрдорд╛ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИред рдЕрдм, рдпрджрд┐ рдЖрдк рдкреБрд░рд╛рдиреЗ рдЬрд╛рд╡рд╛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдФрд░ рд╕реНрдХреАрдорд╛ рдХреЛ рд╣рдЯрд╛рддреЗ рд╣реИрдВ, рддреЛ рдЧреНрд░рд╛рдлрдХреНрдпреВрдПрд▓ рдПрд╕рдкреАрдХреНрдпреВрдЖрд░ рд╕реЗ рдирдП рдЪрд┐рдкреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд╛рд░реНрдЯ рд╕реЗрд╡рд╛ рдХреЛ рдкреБрдирд░рд╛рд░рдВрдн рдХрд░реЗрдВ, рдЖрдк рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╕рдм рдХреБрдЫ рдкрд╣рд▓реЗ рдХреА рддрд░рд╣ рд╣реА рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рд╣рдо рдПрди + 1 рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рддреЗ рд╣реИрдВ


рдпрд╣ рд╕рдордп рдЦ рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ рдкрд░ lshih рд╡рд┐рд╕реНрддрд╛рд░ рдкреВрд░реЗ рдЕрдиреБрд░реЛрдз "рдЙрдиреНрдирдд" рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиред рд╣рдордиреЗ рдЬрд▓реНрджреА рд╕реЗ рдЧреНрд░рд╛рдлрдХрд▓рд╛рдЗрди рдПрдкреАрдЖрдИ рдмрдирд╛рдпрд╛, рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдпрд╣ рдХреБрд╢рд▓рддрд╛ рд╕реЗ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ?

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:



рдЯреЛрдХрд░реА рдкреНрд░рд╛рдкреНрдд cartрдХрд░рдирд╛ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдПрдХ SQL-рдХреНрд╡реЗрд░реА рдореЗрдВ рд╣реЛрддрд╛ рд╣реИред рдбреЗрдЯрд╛ рдкрд░ itemsрдФрд░ subtotalрд╡рд╛рдкрд╕ рд▓реМрдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЯреЛрдХрд░реА рддрддреНрд╡реЛрдВ рдХреЛ рдкреВрд░реЗ рд╕рдВрдЧреНрд░рд╣ рдХреЗ рд╕рд╛рде рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдЙрддреНрд╕реБрдХ рдЬреЗрдкреАрдП рд░рдгрдиреАрддрд┐ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╣реЛрддрд╛ рд╣реИ:

 @Data public class Cart {   @ElementCollection(fetch = FetchType.EAGER)   private List<Item> items = new ArrayList<>();   ... } 



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



рдпрд╣рд╛рдВ рдЪрд╛рд░реНрд▓реНрд╕ рдкреНрд░реЙрдХреНрд╕реА рдореЗрдВ рдХрд╛рд░реНрдЯ рд╕реЗрд╡рд╛ рдФрд░ рдЙрддреНрдкрд╛рдж рд╕реЗрд╡рд╛ рдХреЗ рдмреАрдЪ рд╕рдВрдЪрд╛рд░ рд╣реИ:



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

рдореИрдВ рдПрдХ рдЕрдиреБрд░реЛрдз рдореЗрдВ рд╕рднреА рд╕рд╣реА рдЙрддреНрдкрд╛рдж рдкреНрд░рд╛рдкреНрдд рдХрд░рдХреЗ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдЙрддреНрдкрд╛рдж рд╕реЗрд╡рд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА idsрд╕рдВрдЧреНрд░рд╣ рд╕рдВрд╕рд╛рдзрди рдореЗрдВ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреА рд╣реИ:

 GET /products?ids=:id1,:id2,...,:idn 

рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдЖрдк рдЙрддреНрдкрд╛рдж рдХреНрд╖реЗрддреНрд░ рдХреЗ рд▓рд┐рдП рдирдореВрдирд╛ рд╡рд┐рдзрд┐ рдХреЛрдб рдХреЛ рдХреИрд╕реЗ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ред рдкрд┐рдЫрд▓рд╛ рд╕рдВрд╕реНрдХрд░рдг:

 @GraphQLQuery(name = "product") public Product product(@GraphQLContext CartItem cartItem) {   return http.getForObject(           "http://localhost:9090/products/{id}",           Product.class,           cartItem.getProductId()   ); } 

рдПрдХ рдЕрдзрд┐рдХ рдкреНрд░рднрд╛рд╡реА рдХреЗ рд╕рд╛рде рдмрджрд▓реЗрдВ:

 @GraphQLQuery(name = "product") @Batched public List<Product> products(@GraphQLContext List<Item> items) {   String productIds = items.stream()           .map(Item::getProductId)           .collect(Collectors.joining(","));   return http.getForObject(           "http://localhost:9090/products?ids={ids}",           Products.class,           productIds   ).getProducts(); } 

рд╣рдордиреЗ рдареАрдХ рддреАрди рдХрд╛рдо рдХрд┐рдП:

  • @Batched рдПрдиреЛрдЯреЗрд╢рди рдХреЗ рд╕рд╛рде рдмреВрдЯрд▓реЛрдбрд░ рд╡рд┐рдзрд┐ рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ , рдЬрд┐рд╕рд╕реЗ рдЧреНрд░рд╛рдлрдХреНрдпреВрдПрд▓ рдПрд╕рдкреАрдХреНрдпреВрдЖрд░ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЧрдпрд╛ рдХрд┐ рд▓реЛрдбрд┐рдВрдЧ рдПрдХ рдмреИрдЪ рдХреЗ рд╕рд╛рде рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП;
  • рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдФрд░ рд╕рдВрджрд░реНрдн рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдПрдХ рд╕реВрдЪреА рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛, рдХреНрдпреЛрдВрдХрд┐ рдмреИрдЪ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рд╕реЗ рдпрд╣ рдорд╛рди рд▓рд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдХрдИ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рддреЗ рд╣реИрдВ;
  • рдПрдХ рдмрд╛рд░ рдореЗрдВ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдЙрддреНрдкрд╛рджреЛрдВ рдХреЗ рдЪрдпрди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реБрдП, рд╡рд┐рдзрд┐ рдХреЗ рд╢рд░реАрд░ рдХреЛ рдмрджрд▓ рджрд┐рдпрд╛ред

рдпреЗ рдкрд░рд┐рд╡рд░реНрддрди рд╣рдорд╛рд░реА N + 1 рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИрдВред рдЪрд╛рд░реНрд▓реНрд╕ рдкреНрд░реЙрдХреНрд╕реА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╡рд┐рдВрдбреЛ рдЕрдм рдЙрддреНрдкрд╛рдж рд╕реЗрд╡рд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдиреБрд░реЛрдз рджрд┐рдЦрд╛рддреА рд╣реИ, рдЬреЛ рдПрдХ рд╣реА рдмрд╛рд░ рдореЗрдВ рддреАрди рдЙрддреНрдкрд╛рдж рд▓реМрдЯрд╛рддрд╛ рд╣реИ:



рдкреНрд░рднрд╛рд╡реА рдХреНрд╖реЗрддреНрд░ рдХреЗ рдирдореВрдиреЗ


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

рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИ рдХрд┐ рдЙрддреНрдкрд╛рдж рд╕реЗрд╡рд╛ рдХрд╛ HTTP рдПрдкреАрдЖрдИ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рд╣реА рд╕рдВрдЧреНрд░рд╣ рд╕рдВрд╕рд╛рдзрди рдХреЗ рд▓рд┐рдП рд╢рд╛рдорд┐рд▓ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ :

 GET /products?ids=...?include=:field1,:field2,...,:fieldN 

рдмреВрдЯрд▓реЛрдбрд░ рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП, рдПрдиреЛрдЯреЗрд╢рди рдХреЗ рд╕рд╛рде рдЯрд╛рдЗрдк рд╕реЗрдЯ рдХрд╛ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдЬреЛрдбрд╝реЗрдВ @GraphQLEnvironmentред GraphQL SPQR рд╕рдордЭрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдХреЛрдб "рдЕрдиреБрд░реЛрдз" рдлрд╝реАрд▓реНрдб рдирд╛рдореЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рд╣реИ рдЬреЛ рдЙрддреНрдкрд╛рдж рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЙрдиреНрд╣реЗрдВ рдкреВрд░рд╛ рдХрд░рддрд╛ рд╣реИ:

 @GraphQLQuery(name = "product") @Batched public List<Product> products(@GraphQLContext List<Item> items,                             @GraphQLEnvironment Set<String> fields) {   String productIds = items.stream()           .map(Item::getProductId)           .collect(Collectors.joining(","));   return http.getForObject(           "http://localhost:9090/products?ids={ids}&include={fields}",           Products.class,           productIds,           String.join(",", fields)   ).getProducts(); } 

рдЕрдм рд╣рдорд╛рд░рд╛ рдирдореВрдирд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкреНрд░рднрд╛рд╡реА рд╣реИ, рдПрди + 1 рд╕рдорд╕реНрдпрд╛ рд╕реЗ рд░рд╣рд┐рдд рд╣реИ рдФрд░ рдХреЗрд╡рд▓ рдЖрд╡рд╢реНрдпрдХ рдбреЗрдЯрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ:



"рднрд╛рд░реА" рдкреВрдЫрддрд╛рдЫ


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

 { user(name: "Vova Unicorn") {   friends {     name     friends {       name       friends {         name         friends {            name            ...         }       }     }   } } } 

5-6 рдШреЛрдВрд╕рд▓реЗ рдХреЗ рд╕реНрддрд░ рдкрд░, рдЗрд╕ рддрд░рд╣ рдХреЗ рдЕрдиреБрд░реЛрдз рдХреЗ рдкреВрд░реНрдг рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реЗ рджреБрдирд┐рдпрд╛ рдореЗрдВ рд╕рднреА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХрд╛ рдЪрдпрди рд╣реЛрдЧрд╛ред рд╕рд░реНрд╡рд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рдмреИрдардХ рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рдХрд╛рд░реНрдп рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдФрд░ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдпрд╣ "рдЧрд┐рд░рд╛рд╡рдЯ" рд╣реЛрдЧрд╛ред

рдРрд╕реА рд╕реНрдерд┐рддрд┐рдпреЛрдВ рд╕реЗ рдЦреБрдж рдХреЛ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рдЙрдкрд╛рдп рдХрд░рдиреЗ рдЪрд╛рд╣рд┐рдПред

  • рдЧрд╣рд░рд╛рдИ рдХрд╛ рдЕрдиреБрд░реЛрдз рд╕реАрдорд┐рдд рдХрд░реЗрдВред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЛ рдордирдорд╛рдиреЗ рдШреЛрдВрд╕рд▓реЗ рдХреЗ рд╢рд┐рдХрд╛рд░ рдХреЗ рдбреЗрдЯрд╛ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдПред
  • рдЕрдиреБрд░реЛрдз рдХреА рдЬрдЯрд┐рд▓рддрд╛ рдХреЛ рд╕реАрдорд┐рдд рдХрд░реЗрдВред рдЕрдиреБрд░реЛрдз рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдлрд╝реАрд▓реНрдб рдХрд╛ рднрд╛рд░ рдЕрд╕рд╛рдЗрди рдХрд░рдХреЗ рдФрд░ рд╕рднреА рдлрд╝реАрд▓реНрдбреНрд╕ рдХреЗ рд╡рдЬрди рдХреА рд░рд╛рд╢рд┐ рдХреА рдЧрдгрдирд╛ рдХрд░рдХреЗ, рдЖрдк рд╕рд░реНрд╡рд░ рдкрд░ рдРрд╕реЗ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдпрд╛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреНрд░рд╢реНрди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:

 { cart(id: 1) {   items {     product {       title     }     quantity   }   subTotal } } 

рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдЗрд╕ рддрд░рд╣ рдХреЗ рдЕрдиреБрд░реЛрдз рдХреА рдЧрд╣рд░рд╛рдИ 4 рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╕рдмрд╕реЗ рд▓рдВрдмрд╛ рд░рд╛рд╕реНрддрд╛ рдЗрд╕рдХреЗ рдЕрдВрджрд░ рд╣реИ cart -> items -> product -> titleред

рдпрджрд┐ рд╣рдо рдорд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдлрд╝реАрд▓реНрдб рдХрд╛ рд╡рдЬрди 1 рд╣реИ, рддреЛ рдХреНрд╡реЗрд░реА рдореЗрдВ 7 рдлрд╝реАрд▓реНрдб рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП, рдЗрд╕рдХреА рдЬрдЯрд┐рд▓рддрд╛ рднреА рд╣реИ 7.

рдЧреНрд░рд╛рдлрд╝рдХреНрдпреВрдПрд▓ рдЬрд╛рд╡рд╛ рдореЗрдВ, рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рддреЗ рд╕рдордп рдЕрддрд┐рд░рд┐рдХреНрдд рдЗрдВрд╕реНрдЯреНрд░реВрдореЗрдВрдЯреЗрд╢рди рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдХреЗ рдЪреЗрдХ рдХрд╛ рд╕реБрдкрд░рдкреЛрдЬрд╝рд┐рд╢рди рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ GraphQL:

 GraphQL.newGraphQL(schema)       .instrumentation(new ChainedInstrumentation(Arrays.asList(               new MaxQueryComplexityInstrumentation(20),               new MaxQueryDepthInstrumentation(3)       )))       .build(); 

рдЗрдВрд╕реНрдЯреНрд░реВрдореЗрдВрдЯреЗрд╢рди MaxQueryDepthInstrumentationрдЕрдиреБрд░реЛрдз рдХреА рдЧрд╣рд░рд╛рдИ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдмрд╣реБрдд "рдЧрд╣рди" рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, 3 рд╕реЗ рдЕрдзрд┐рдХ рдХреА рдЧрд╣рд░рд╛рдИ рдХреЗ рд╕рд╛рде)ред рдХрд┐рд╕реА рдХреНрд╡реЗрд░реА рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ

рдЗрдВрд╕реНрдЯреНрд░реВрдореЗрдВрдЯреЗрд╢рди MaxQueryComplexityInstrumentationрдЗрд╕рдХреА рдЬрдЯрд┐рд▓рддрд╛ рдХреА рдЬрд╛рдБрдЪ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдпрд╣ рд╕рдВрдЦреНрдпрд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдорд╛рди (20) рд╕реЗ рдЕрдзрд┐рдХ рд╣реИ, рддреЛ рдРрд╕рд╛ рдЕрдиреБрд░реЛрдз рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЖрдк рдкреНрд░рддреНрдпреЗрдХ рдХреНрд╖реЗрддреНрд░ рдХреЗ рд▓рд┐рдП рд╡рдЬрди рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЙрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рджреВрд╕рд░реЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ "рдХрдард┐рди" рдорд┐рд▓рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЙрддреНрдкрд╛рдж рдХреНрд╖реЗрддреНрд░ рдХреЛ @GraphQLComplexity,рдЧреНрд░рд╛рдлрд╝рд┐рдХрд▓ рдПрд╕рдкреАрдХреНрдпреВрдЖрд░ рдореЗрдВ рд╕рдорд░реНрдерд┐рдд рдПрдиреЛрдЯреЗрд╢рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрдЯрд┐рд▓рддрд╛ 10 рд╕реМрдВрдкрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ :

 @GraphQLQuery(name = "product") @GraphQLComplexity("10") public List<Product> products(...) 

рдпрд╣рд╛рдВ рдЧрд╣рд░рд╛рдИ рд╕реЗ рдЬрд╛рдВрдЪ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ рдЬрдм рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдореВрд▓реНрдп рд╕реЗ рдЕрдзрд┐рдХ рд╣реИ:



рд╡реИрд╕реЗ, рдЗрдВрд╕реНрдЯреНрд░реВрдореЗрдВрдЯреЗрд╢рди рддрдВрддреНрд░ рдкреНрд░рддрд┐рдмрдВрдз рд▓рдЧрд╛рдиреЗ рддрдХ рд╕реАрдорд┐рдд рдирд╣реАрдВ рд╣реИред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдиреНрдп рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рднреА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреИрд╕реЗ рд▓реЙрдЧрд┐рдВрдЧ рдпрд╛ рдЯреНрд░реЗрд╕рд┐рдВрдЧред

рд╣рдордиреЗ "рд╕реБрд░рдХреНрд╖рд╛" рдЙрдкрд╛рдпреЛрдВ рдХреА рдЬрд╛рдБрдЪ рдХреА, рдЬреЛ рдЧреНрд░рд╛рдлрд╝рд┐рдХрд▓ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдПрдкреАрдЖрдИ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рдХрдИ рддрд░рдХреАрдмреЗрдВ рд╣реИрдВ:

  • рдереНрд░реЙрдЯрд▓рд┐рдВрдЧ / рд░реЗрдЯ-рд▓рд┐рдорд┐рдЯрд┐рдВрдЧ - рд╕рдордп рдХреА рдкреНрд░рддрд┐ рдпреВрдирд┐рдЯ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рд╕реАрдорд┐рдд рдХрд░реЗрдВ
  • рдЯрд╛рдЗрдордЖрдЙрдЯ - рдЕрдиреНрдп рд╕реЗрд╡рд╛рдУрдВ, рдбреЗрдЯрд╛рдмреЗрд╕, рдЖрджрд┐ рдХреЗ рд╕рд╛рде рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП рд╕рдордп рд╕реАрдорд╛;
  • рдкреГрд╖реНрда рдкрд░ рдЕрдВрдХ рд▓рдЧрд╛рдирд╛ - pagination supportред

рдбреЗрдЯрд╛ рдХрд╛ рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрди


рдЕрдм рддрдХ, рд╣рдо рд╡рд┐рд╢реБрджреНрдз рд░реВрдк рд╕реЗ рдбреЗрдЯрд╛ рд╕реИрдВрдкрд▓рд┐рдВрдЧ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рд▓реЗрдХрд┐рди GraphQL рдЖрдкрдХреЛ рди рдХреЗрд╡рд▓ рдбреЗрдЯрд╛ рдХреА рдкреНрд░рд╛рдкреНрддрд┐, рдмрд▓реНрдХрд┐ рдЙрдирдХреЗ рдкрд░рд┐рд╡рд░реНрддрди рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рддрдВрддреНрд░ рд╣реИ ред рдпреЛрдЬрдирд╛ рдореЗрдВ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╕реНрдерд╛рди рдЖрд░рдХреНрд╖рд┐рдд рд╣реИ - рдХреНрд╖реЗрддреНрд░ mutation:

 schema { query: EntryPoints, mutation: Mutations } 

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдЙрддреНрдкрд╛рдж рдХреЛ рдЯреЛрдХрд░реА рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЖрдпреЛрдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

 type Mutations {   addProductToCart(cartId: Long!,                    productId: String!,                    count: Int = 1): Cart } 

рдпрд╣ рдПрдХ рдХреНрд╖реЗрддреНрд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд╕рдорд╛рди рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдПрдХ рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрди рдореЗрдВ рдкреИрд░рд╛рдореАрдЯрд░ рдФрд░ рдПрдХ рд╡рд╛рдкрд╕реА рдореВрд▓реНрдп рднреА рд╣реЛрддрд╛ рд╣реИред

GraphQL SPQR рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рд░реНрд╡рд░ рдХреЛрдб рдореЗрдВ рдПрдХ рдореНрдпреВрдЯреЗрд╢рди рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:

 @GraphQLMutation(name = "addProductToCart") public Cart addProductToCart(       @GraphQLArgument(name = "cartId") Long cartId,       @GraphQLArgument(name = "productId") String productId,       @GraphQLArgument(name = "quantity", defaultValue = "1") int quantity) {   return cartService.addProductToCart(cartId, productId, quantity); } 

рдмреЗрд╢рдХ, рдЕрдзрд┐рдХрд╛рдВрд╢ рдЙрдкрдпреЛрдЧреА рдХрд╛рд░реНрдп рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ cartServiceред рдФрд░ рдЗрд╕ рдЗрдВрдЯрд░рд▓реЗрдпрд░ рд╡рд┐рдзрд┐ рдХрд╛ рдХрд╛рд░реНрдп рдЗрд╕реЗ рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рдирд╛ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдбреЗрдЯрд╛ рд╕реИрдВрдкрд▓рд┐рдВрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдПрдиреЛрдЯреЗрд╢рди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдпрд╣ @GraphQL*рд╕рдордЭрдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИ рдХрд┐ рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рд╕реЗ рдХреМрди рд╕рд╛ рдЧреНрд░рд╛рдлрдХреНрдпреВрдПрд▓ рд╕реНрдХреАрдорд╛ рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИред

GraphQL рдХрдВрд╕реЛрд▓ рдореЗрдВ, рдЕрдм рдЖрдк рд╣рдорд╛рд░реЗ рдЯреЛрдХрд░реА рдореЗрдВ 2 рдореЗрдВ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрддреНрдкрд╛рдж рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрди рдЕрдиреБрд░реЛрдз рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 mutation { addProductToCart(     cartId: 1,     productId: "59eb83c0040fa80b29938e3f",     quantity: 2) {   items {     product {       title     }     quantity     total   }   subTotal } } 

рдЪреВрдВрдХрд┐ рдореНрдпреВрдЯреЗрд╢рди рдХрд╛ рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВ рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рдирд┐рдпрдореЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╣рдордиреЗ рдЙрд╕реА рдирд┐рдпрдореЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдлрд╝реАрд▓реНрдб рд╕реЗ рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛ рд╣реИред

рдХрдИ рдЖрдЧрдВрддреБрдХ рд╡рд┐рдХрд╛рд╕ рдЯреАрдореЗрдВ рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рдЧреНрд░рд╛рдлрд╛рдХрд╛ рдХреЗ рд╕рд╛рде рд╕реНрдХрд╛рд▓рд╛ рдФрд░ рд╕рдВрдЧрд░рд┐рдпрд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реА рд╣реИрдВ, рдЗрд╕ рднрд╛рд╖рд╛ рдореЗрдВ рдЧреНрд░рд╛рдлрдХрд▓рд╛рдЗрди рдХрд╛ рдореБрдЦреНрдп рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИред

HTML рдХрд╛ рдкреНрд░рддрд┐рдкрд╛рджрди рдХрд░рддреЗ рд╕рдордп, рдЧреНрд░рд╛рдлрд╝рд┐рдХреНрд╕ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдЙрдкрдпреЛрдЧреА рддрдХрдиреАрдХреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдЧреНрд░рд╛рдлрдХреНрд▓рд╛рдЗрди рдкреНрд░рд╢реНрдиреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рд╣реИред JSON рдХреЛ рд╕реАрдзреЗ рдкреЗрдЬ рдХреЛрдб рдореЗрдВ рдЬрдирд░реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдо рдРрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣рд╛рдВ HTML рдЯреЗрдореНрдкрд▓реЗрдЯ рднрд░рдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

 // Pre-rendered <html> <script data-embedded-graphiql> {   product(productId: $productId)     title     description     price     ...   } } </script> </html> 

рдФрд░ рдпрд╣рд╛рдБ рдЙрддреНрдкрд╛рджрди рд╣реИ:

 // Rendered <html> <script> window.DATA = {   product: {          title: 'GraphQL Sticker',          description: 'High quality sticker',           price: '$2'           ... } } </script> </html> 


HTML рд░реЗрдВрдбрд░рд░ рдФрд░ рдЧреНрд░рд╛рдлрдХреЙрд▓ рд╕рд░реНрд╡рд░ рдХрд╛ рдРрд╕рд╛ рд╕рдВрдпреЛрдЬрди рд╣рдореЗрдВ рд╣рдорд╛рд░реЗ рдПрдкреАрдЖрдИ рдХреЛ рдЕрдзрд┐рдХрддрдо рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдФрд░ рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдХреА рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдкрд░рдд рдирд╣реАрдВ рдмрдирд╛рдиреЗ рджреЗрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рддрдХрдиреАрдХ рдЕрдХреНрд╕рд░ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд▓рд╛рднрдкреНрд░рдж рд╕рд╛рдмрд┐рдд рд╣реЛрддреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдкреГрд╖реНрда рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдкрд╣рд▓реЗ рдЖрд╡рд╢реНрдпрдХ рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рдмреИрдХрдПрдВрдб рдкрд░ рдЬрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ - рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкреГрд╖реНрда рдкрд░ рд╣реИред

рдЧреНрд░рд╛рдлрдХреЙрд▓ рдХреЗ рдиреБрдХрд╕рд╛рди


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

  • -, GraphQL . GraphQL , HTTP API. Cache-Control Last-Modified HTTP GraphQL API. , proxy gateways (Varnish, Fastly ). , GraphQL , , .
  • GraphQL тАФ . , API, , .
  • GraphQL . .
  • . GraphQL тАФ . JSON XML, , , GraphQL, .
  • GraphQL . , HTTP PUT POST -. , . GraphQL . .
  • . , -: ┬лdelete┬╗ ┬лkill┬╗, ┬лannihilate┬╗ ┬лterminate┬╗, . GraphQL API . HTTP DELETE .
  • Joker 2016 . GraphQL . API- , , , HATEOAS, , ┬л REST┬╗. , , GraphQL .

рдпрд╣ рднреА рдпрд╛рдж рд░рдЦрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдк HTTP рдПрдкреАрдЖрдИ рдХреЛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдлрд▓ рдирд╣реАрдВ рд╣реБрдП рд╣реИрдВ, рддреЛ рдЖрдк рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рдЧреНрд░рд╛рдлрд╝рд┐рдХрд▓ рдПрдкреАрдЖрдИ рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдВрдЧреЗред рдЖрдЦрд┐рд░, рдХрд┐рд╕реА рднреА рдПрдкреАрдЖрдИ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдореЗрдВ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХреНрдпрд╛ рд╣реИ? рдЖрдВрддрд░рд┐рдХ рдбреЛрдореЗрди рдореЙрдбрд▓ рдХреЛ рдмрд╛рд╣рд░реА рдПрдкреАрдЖрдИ рдореЙрдбрд▓ рд╕реЗ рдЕрд▓рдЧ рдХрд░реЗрдВред рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдЖрдВрддрд░рд┐рдХ рдЙрдкрдХрд░рдг рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдкрд░рд┐рджреГрд╢реНрдп рдХреЗ рдЖрдзрд╛рд░ рдкрд░ API рдмрдирд╛рдПрдВред рдХреЗрд╡рд▓ рдЖрд╡рд╢реНрдпрдХ рдиреНрдпреВрдирддрдо рдЬрд╛рдирдХрд╛рд░реА рдЦреЛрд▓реЗрдВ, рдФрд░ рд╕рднреА рдПрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ рдирд╣реАрдВред рд╕рд╣реА рдирд╛рдо рдЪреБрдиреЗрдВред рдЧреНрд░рд╛рдл рдХрд╛ рд╕рд╣реА рд╡рд░реНрдгрди рдХрд░реЗрдВред HTTP API рдореЗрдВ рдПрдХ рд░рд┐рд╕реЛрд░реНрд╕ рдЧреНрд░рд╛рдл рдФрд░ GraphQL API рдореЗрдВ рдПрдХ рдлреАрд▓реНрдб рдЧреНрд░рд╛рдл рд╣реЛрддрд╛ рд╣реИред рджреЛрдиреЛрдВ рд╣реА рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдпрд╣ рдЧреНрд░рд╛рдл рдЧреБрдгрд╛рддреНрдордХ рд░реВрдк рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

HTTP рдПрдкреАрдЖрдИ рджреБрдирд┐рдпрд╛ рдореЗрдВ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ, рдФрд░ рдЬрдм рдЖрдкрдХреЛ рдЬрдЯрд┐рд▓ рдЪрдпрдиреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рддреЛ рдЖрдкрдХреЛ рд╣рдореЗрд╢рд╛ рдЧреНрд░рд╛рдлрд╝рдХреЙрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдУрдбрдЯрд╛ рдорд╛рдирдХ рд╣реИ, рдЬреЛ рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рд╡рд┐рд╕реНрддрд╛рд░ рдФрд░ рдЪрдпрди рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдЧреНрд░рд╛рдлрдХреНрдпреВрдПрд▓, рдФрд░ HTTP рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдПрдХ рдорд╛рдирдХ JSON рдПрдкреАрдЖрдИ рд╣реИ рдЬреЛ JSON рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╣рд╛рдЗрдкрд░рдореАрдбрд┐рдпрд╛ рдФрд░ рдЬрдЯрд┐рд▓ рднреНрд░реВрдг рдХреНрд╖рдорддрд╛рдУрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред LinkRest рднреА рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрдк https://youtu.be/EsldBtrb1Qc "> рдЬреЛрдХрд░ 2017 рдкрд░ рдПрдВрдбреНрд░рд╕ рдПрдбрдордЪрд┐рдХ рдХреА рд░рд┐рдкреЛрд░реНрдЯ рд╕реЗ рдЕрдзрд┐рдХ рдЬрд╛рди рд╕рдХрддреЗ рд╣реИрдВ ред

рдЬреЛ рд▓реЛрдЧ рдЧреНрд░рд╛рдлрдХреЙрд▓рд┐рдХ рдХреЛ рдЖрдЬрдорд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЙрдирдХреЗ рд▓рд┐рдП рдореИрдВ рдЙрди рдЗрдВрдЬреАрдирд┐рдпрд░реЛрдВ рдХреЗ рддреБрд▓рдирд╛рддреНрдордХ рд▓реЗрдЦреЛрдВ рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рджреГрдврд╝рддрд╛ рд╕реЗ рдХрд╣рддрд╛ рд╣реВрдВ рдЬреЛ рдЧрд╣рд░рд╛рдИ рд╕реЗ рдкрд╛рд░рдВрдЧрдд рд╣реИрдВред рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдФрд░ рджрд╛рд░реНрд╢рдирд┐рдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ REST рдФрд░ рдЧреНрд░рд╛рдлрдХрд▓рд╛рдЗрди:


рдЕрдВрдд рдореЗрдВ рд╕рдмреНрд╕рдХреНрд░рд┐рдкреНрд╢рди рдФрд░ рдбрд┐рдлрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ


рдЧреНрд░рд╛рдлрд┐рдВрдХ рдХрд╛ рдорд╛рдирдХ рдПрдкреАрдЖрдИ рдкрд░ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рд▓рд╛рдн рд╣реИред GraphQL рдореЗрдВ, рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдФрд░ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рджреЛрдиреЛрдВ рдПрдХ рд╣реА рдЫрдд рдХреЗ рдиреАрдЪреЗ рдмреИрда рд╕рдХрддреЗ рд╣реИрдВред

рд╣рдордиреЗ рдЖрдкрдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ query, рд╕рд░реНрд╡рд░ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдмрджрд▓рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ mutation, рд▓реЗрдХрд┐рди рдПрдХ рдФрд░ рдЕрдЪреНрдЫрд╛рдИ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕рджрд╕реНрдпрддрд╛ рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ subscriptionsред

рдХрд▓реНрдкрдирд╛ рдХреАрдЬрд┐рдП рдХрд┐ рдПрдХ рдЧреНрд░рд╛рд╣рдХ рдЯреЛрдХрд░реА рдореЗрдВ рдПрдХ рдЙрддреНрдкрд╛рдж рдХреЛ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реВрдЪрдирд╛рдПрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИред рдЧреНрд░рд╛рдлрдХреЙрд▓ рдПрдкреАрдЖрдИ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ, рдпрд╣ рдЗрд╕ рддрд░рд╣ рдХреА рдпреЛрдЬрдирд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

 schema { query: Queries, mutation: Mutations, subscription: Subscriptions } type Subscriptions { productAdded(cartId: String!): Cart } 

рдЧреНрд░рд╛рд╣рдХ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЕрдиреБрд░реЛрдз рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рджрд╕реНрдпрддрд╛ рд▓реЗ рд╕рдХрддрд╛ рд╣реИ:

 subscription { productAdded(cart: 1) {   items {     product ...   }   subTotal } } 

рдЕрдм, рд╣рд░ рдмрд╛рд░ рдПрдХ рдЙрддреНрдкрд╛рдж рдХреЛ рдЯреЛрдХрд░реА 1 рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╕рд░реНрд╡рд░ рдЯреЛрдХрд░реА рдореЗрдВ рдЕрдиреБрд░реЛрдзрд┐рдд рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдкреНрд░рддреНрдпреЗрдХ рд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдмрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдПрдХ рд╕рдВрджреЗрд╢ рднреЗрдЬреЗрдЧрд╛ред рдлрд┐рд░ рд╕реЗ, рдЧреНрд░рд╛рдлрдХреЙрд▓ рдиреАрддрд┐ рдЬрд╛рд░реА рд░рдЦрддреЗ рд╣реБрдП, рдХреЗрд╡рд▓ рд╡рд╣ рдбреЗрдЯрд╛ рдЬреЛ рдЧреНрд░рд╛рд╣рдХ рдиреЗ рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛ рд╣реИ рдЬрдм рд╕рджрд╕реНрдпрддрд╛ рдЖрдПрдЧреА:

 { "data": {   "productAdded": {     "items": [       { "product": тАж, "subTotal": тАж },       { "product": тАж, "subTotal": тАж },       { "product": тАж, "subTotal": тАж },       { "product": тАж, "subTotal": тАж }     ],     "subTotal": 289.33   } } } 

рдЧреНрд░рд╛рд╣рдХ рдЕрдм рдЯреЛрдХрд░реА рдХреЛ рдлрд┐рд░ рд╕реЗ рдЦреЛрд▓ рд╕рдХрддрд╛ рд╣реИ, рдЬрд░реВрд░реА рдирд╣реАрдВ рдХрд┐ рдкреВрд░реЗ рдкреГрд╖реНрда рдХреЛ рдлрд┐рд░ рд╕реЗ рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рдПред

рдпрд╣ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдПрдкреАрдЖрдИ (HTTP) рдФрд░ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ API (WebSocket) рджреЛрдиреЛрдВ рдХреЛ рд░реЗрдЦрд╛рдВрдХрди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╕рдВрдЪрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдФрд░ рдЙрджрд╛рд╣рд░рдг рд╣реИ, рдбреЗрдлрд░ рддрдВрддреНрд░ ред рдореБрдЦреНрдп рд╡рд┐рдЪрд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ рдЧреНрд░рд╛рд╣рдХ рдпрд╣ рдЪреБрдирддрд╛ рд╣реИ рдХрд┐ рд╡рд╣ рдХреМрди рд╕рд╛ рдбреЗрдЯрд╛ рддреБрд░рдВрдд (рд╕рд┐рдВрдХреНрд░реЛрдирд╕) рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рдФрд░ рд╡реЗ рдЬрд┐рд╕реЗ рдмрд╛рдж рдореЗрдВ (рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ) рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕ рддрд░рд╣ рдХреЗ рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП:

 query { feedStories {   author { name }   message   comments @defer {     author { name }     message   } } } 

рд╕рд░реНрд╡рд░ рдкрд╣рд▓реЗ рд▓реЗрдЦрдХ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдХрд╣рд╛рдиреА рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрджреЗрд╢ рд▓реМрдЯрд╛рдПрдЧрд╛:

 { "data": {   "feedStories": [     {       "author": тАж,       "message": тАж     },     {       "author": тАж,       "message": тАж     }   ] } } 

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

 { "path": [ "feedStories", 0, "comments" ], "data": [   {     "author": тАж,     "message": тАж   } ] } 

рдирдореВрдирд╛ рд╕реНрд░реЛрдд


рдЗрд╕ рд░рд┐рдкреЛрд░реНрдЯ рдХреЛ рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдХреЛрдб GitHub рдкрд░ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред

рд╣рд╛рд▓ рд╣реА рдореЗрдВ, рд╣рдордиреЗ JPoint 2019 рдХреА рдШреЛрд╖рдгрд╛ рдХреА , рдЬреЛ 5-6 рдЕрдкреНрд░реИрд▓, 2019 рдХреЛ рдЖрдпреЛрдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЖрдк рд╣рдорд╛рд░реЗ рд╣рдм рд╕реЗ рд╕рдореНрдореЗрд▓рди рд╕реЗ рдХреНрдпрд╛ рдЙрдореНрдореАрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рди рд╕рдХрддреЗ рд╣реИрдВ ред рджрд┐рд╕рдВрдмрд░ рдХреЗ рдкрд╣рд▓реЗ рддрдХ, рдЕрд░реНрд▓реА рдмрд░реНрдб рдЯрд┐рдХрдЯ рдЕрднреА рднреА рд╕рдмрд╕реЗ рдХрдо рдХреАрдордд рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИрдВ ред

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


All Articles