38-წუთიანი სამუშაო სესია ვების ზმნებზე — GET, POST, PUT, PATCH, DELETE — მათ უკან მდგარ უსაფრთხოებისა და იდემპოტენტურობის წესებზე, სტატუს-კოდებზე, რომლებსაც მნიშვნელობა აქვს, იმაზე, როგორ დავამოდელიროთ რესურსი ისე, რომ კლიენტები, ქეშები და პროქსები ერთნაირად ხედავდნენ, რას აკეთებს თქვენი ენდპოინტი, და იმ ინსტრუმენტებსა და API-სტილებზე, რომლებსაც პრაქტიკაში მიმართავთ.
HTTP მხოლოდ ბაიტების გადასატანი მილი არაა — ეს საერთო კონტრაქტია. თქვენს კოდსა და სერვერს შორის დგას დამხმარეების მთელი ბრბო: ბრაუზერი, CDN (ედჟ-სერვერების ქსელი, რომელიც ასლებს მომხმარებლებთან ახლოს ინახავს), პროქსები და დატვირთვის ბალანსერები (რელეები, რომლებიც ტრაფიკს გადასცემენ და ანაწილებენ) და თქვენივე ხელახალი მცდელობის ლოგიკა. თითოეული მათგანი კითხულობს მეთოდს და თავად წყვეტს, რა შეუძლია: შეინახოს პასუხი, წინასწარ წამოიღოს იგი (prefetch) თუ ტაიმაუტის შემდეგ ხელახლა გააგზავნოს. დაარღვევთ მეთოდის დაპირებას და მთელი ეს ბრბო ჩუმად თქვენს წინააღმდეგ იმუშავებს.
GET /users/42 HTTP/1.1).შედის მეთოდი + გზა + ჰედერები + სხეული; ბრუნდება სტატუსი + ჰედერები + სხეული. ზედა ზმნა განაგებს ყველაფერს.
ნულოვანი წესი: მეთოდმა სიმართლე უნდა თქვას ეფექტის შესახებ. ამ საუბარში ყველაფერი სწორედ ამ ერთი დაპირებიდან გამომდინარეობს.
GET, POST, PUT, PATCH და DELETE თითქმის ყველაფერს ფარავს, რასაც ააგებთ; HEAD და OPTIONS არსებობს მეტამონაცემებისა და შეთანხმებისთვის. გადაათვალიერეთ თითოეული — მიაქციეთ ყურადღება, რას უშვრება მდგომარეობას და ატარებს თუ არა სხეულს.
/users/42 ნიშნავს „წაკითხვას“, „ჩანაცვლებას“ ან „წაშლას“ — მთლიანად იმაზეა დამოკიდებული, ზმნა GET-ია, PUT თუ DELETE. არსებითი სახელი URL-ია; ზმნა კი — მეთოდი./orders) წყვეტს, არა კლიენტი.ქსელი მუდმივად კარგავს პასუხებს. შეუძლია თუ არა თქვენს კლიენტს, პროქსის ან დატვირთვის ბალანსერს მოთხოვნის უსაფრთხოდ გამეორება — ორ სიტყვაზეა დამოკიდებული; და სწორედ მათი აღრევით ხდება, რომ ბარათს ორჯერ ჩამოეჭრება თანხა.
სუფთა წაკითხვები. დააქეშირეთ, წინასწარ წამოიღეთ, გაიმეორეთ — ქვემოთ არაფერი იცვლება. ნაგულისხმევად ქეშირებადია.
ისინი ცვლიან მდგომარეობას, მაგრამ საბოლოო მდგომარეობა სტაბილურია: ზუსტად ეს სხეული ორჯერ PUT-ით → იგივე ჩანაწერი; ორჯერ DELETE → მაინც წაშლილია. გამეორება უსაფრთხოა.
ორჯერ POST ორ რესურსს ქმნის. დელტა-PATCH (balance += 10) გროვდება. გაიმეორეთ მხოლოდ იდემპოტენტურობის დამცავით. *მნიშვნელობის მიმნიჭებელი PATCH იდემპოტენტურია
იკარგება პასუხი, არა მოთხოვნა. გამეორება იდენტურია — ამიტომ დუბლიკატისგან მხოლოდ იდემპოტენტურობა გიცავთ.
როცა ნამდვილად გჭირდებათ, რომ არაიდემპოტენტურმა შექმნამ გამეორებებს გაუძლოს, მიეცით კლიენტს საშუალება, გამოაგზავნოს იდემპოტენტურობის გასაღები. სერვერი მას იმახსოვრებს და გამეორებისას თავდაპირველ შედეგს აბრუნებს — დუბლიკატის გარეშე.
ჰგავს გარდერობის ნომერს — ერთი და იმავე ტალონს ორჯერ რომც გადასცეთ, მაინც ერთ პალტოს დაგიბრუნებენ.
სტატუს-კოდი სამციფრიანი შეჯამებაა, რომელსაც მთელი სტეკი ხვდება. სამოცივე არ გჭირდებათ — გჭირდებათ სწორი კლასის გამოყენება და ის ათიოდე კოდი, რომელსაც რეალურად დააბრუნებთ.
Location ჰედერი.Retry-After-თან.ავტომატიზაციისთვის ყველაზე მნიშვნელოვანი გაყოფა: 4xx = ნუ გაიმეორებთ, გაასწორეთ მოთხოვნა; 5xx = სერვერი ჩავარდა, იდემპოტენტური ზმნის გამეორება ნორმალურია.
REST-ის მთავარი ხრიკი: ქმედება URL-ში ნუ ჩასვამთ. დაასახელეთ რესურსი და დანარჩენი HTTP-მეთოდს ათქმევინეთ, რა უნდა უყოს მას. ერთი თანმიმდევრული ფორმა ცვლის მორგებული ენდპოინტების მთელ ჯუნგლს.
კოლექცია ინახავს ელემენტებს; ელემენტებს კი ქვეკოლექციები შეიძლება ჰქონდეთ. იგივე ექვსი მეთოდი მუშაობს ყველა დონეზე.
/users, /orders — და არა /getUser./users/42/orders იკითხება როგორც „42-ე მომხმარებლის შეკვეთები“.?role=admin&sort=name&page=2 — და არა ახალი გზები./purchase-orders, არასოდეს /PurchaseOrders/create.ჰგავს საბუთების კარადას: უჯრები და საქაღალდეები არსებითი სახელებია; ის, რასაც აკეთებთ (შეიტანთ, წაიკითხავთ, გაანადგურებთ), თქვენ მიერ მოტანილი ქმედებაა.
სხეული დატვირთვაა; ჰედერები კი მის გარშემო შეკრული კონტრაქტია — რა ფორმატი, რა ავთენტიფიკაცია, რამდენ ხანს რჩება ახალი. ორი ნიმუში ყოველდღიურად იმართლებს თავს: კონტენტის შეთანხმება და ქეშირება.
კლიენტი აცხადებს, რას იღებს; სერვერი აცხადებს, რა გამოაგზავნა. ერთსა და იმავე URL-ს შეუძლია მოთხოვნის მიხედვით მოგაწოდოთ JSON, CSV ან სხვა ენა.
Cache-Control ადგენს სიახლის ბიუჯეტს; ETag კი სხეულის ანაბეჭდია. ერთად ისინი კლიენტს აძლევენ საშუალებას, გამოტოვოს ჩამოტვირთვა, როცა არაფერი შეცვლილა.
კლიენტი თავის ETag-ს უკან აგზავნის; თუ ის ისევ ემთხვევა, სერვერი პასუხობს 304-ით, სხეულის გარეშე — თითქმის უფასო პასუხით.
If-Match) ასევე იცავს დაკარგული განახლებებისგან — უარყავით PUT, რომლის ETag მოძველებულია, 409 Conflict-ით.სემანტიკა ხსნის ქსელს. გულწრფელი ზმნები ქეშებს, CDN-ებსა და პირობით მოთხოვნებს უფასოდ ამუშავებს — დაარღვევთ და ყველაფერ ამაზე უარს ამბობთ.
აქამდე ყველაფერი პროტოკოლი იყო. ყოველდღიურად კი API-ს კლიენტით ჩხრეკთ, სპეციფიკაციით აღწერთ და საერთო სტილს ირჩევთ. აი, წამყვანი ვარიანტები — თითოეულს ერთი გულწრფელი დადებითი და ერთი გულწრფელი უარყოფითი მხარე, და მარტივი წესი არჩევანისთვის.
პაწაწინა ტერმინალის პროგრამა, რომელიც თითქმის ყველა მანქანაზე უკვე დგას და დაუმუშავებელ HTTP-ზე საუბრობს. მეთოდს, URL-ს, ჰედერებსა და სხეულს თავად კრეფთ.
ყველაზე პოპულარული ვიზუალური API-კლიენტი. მოთხოვნებს აგებთ, ინახავთ და აზიარებთ, აჯგუფებთ კოლექციებად და ამატებთ ტესტებსა და მოკ-სერვერებს.
ღია კოდის გრაფიკული კლიენტი, Postman-ზე მჭლე, REST-ისა და GraphQL-ის სრულფასოვანი მხარდაჭერითა და მარტივი OpenAPI-იმპორტით.
როგორ ავირჩიო: curl — ავტომატიზაციისა და გამართვისთვის, Postman — როცა გუნდს დიდი, დოკუმენტირებული API უნდა გააზიაროს, Insomnia — როცა სწრაფი ლოკალური კლიენტი გინდათ ან GraphQL-ში ცხოვრობთ.
არსებითი სახელები გზაში, HTTP-მეთოდები ზმნების როლში — ზუსტად ის, რაზეც მთელი ეს საუბარი იყო. ვებ-API-ების უმეტესობის ნაგულისხმევი არჩევანი.
ერთადერთი URL, სადაც კლიენტი აგზავნის შეკითხვას ზუსტად იმ ველების დასახელებით, რაც სურს, და მხოლოდ მათ იღებს — არც მეტს, არც ნაკლებს.
ბინარული, კონტრაქტზე დაფუძნებული სტილი (HTTP/2-ზე), სადაც სერვისის ტიპიზირებულ მეთოდებს იძახებთ — UserService.Get() — თითქმის ისე, როგორც ლოკალურ ფუნქციას.
როგორ ავირჩიო: REST — საჯარო, რესურსული ფორმის API-ებისთვის; GraphQL — როცა კლიენტებს მოქნილი, ღრმად ჩალაგებული მონაცემები სჭირდებათ; gRPC — სწრაფი შიდა, სერვისიდან სერვისზე ტრაფიკისთვის.
იგივე მონაცემები, სამი ფორმა: REST რამდენიმე გამოძახებას აკეთებს, GraphQL ყველაფერს ერთი შეკითხვით ითხოვს, gRPC კი ერთ ტიპიზირებულ გამოძახებას აკეთებს.
ჰგავს ლანჩის შეკვეთას: REST სამი ცალკე დახლია, GraphQL — ერთი მორგებული შეკვეთა, gRPC კი სამზარეულოსთან დადებული მუდმივი შეთანხმება.
აქამდე ყველაფერი ერთ დიზაინის არჩევანში იყრის თავს. ავიღოთ „შეკვეთის გაუქმება“ და ვნახოთ, როგორ ერთვება ყველა წესი ერთდროულად.
„URL არსებითი სახელია, მეთოდი კი — ზმნა; ორივემ სიმართლე უნდა თქვას.“
— მთელი საუბარი ერთ ხაზში
ხუთი სწრაფი კითხვა HTTP-მეთოდებზე, უსაფრთხოებასა და იდემპოტენტურობაზე, სტატუს-კოდებსა და REST-ზე — მყისიერი პასუხი, შესვლის გარეშე.
ნავიგაცია ← → ღილაკებით ან სქროლით · უკან ბიბლიოთეკაში