36-წუთიანი სამუშაო სესია იმაზე, როგორ ავაგოთ HTTP API-ები, რომელთა გამოყენებაც ადამიანებს ნამდვილად სიამოვნებთ — რესურსების მოდელირება, არჩევანი REST/GraphQL/gRPC-ს შორის, პაგინაცია და შეცდომები, ვერსიონირება, იდემპოტენტურობა და ავთენტიფიკაცია, და კონტრაქტის ჯერ დაწერა. გულახდილები ვიქნებით იმაზეც, სად იმარჯვებს მოსაწყენი ვარიანტი.
იმ წამიდან, როცა ვინმე თქვენი ენდპოინტისთვის კოდს წერს, თქვენ უკვე ხელმოწერილი გაქვთ კონტრაქტი. შიგნით ყველაფრის გადაწერა თავისუფლად შეგიძლიათ, მაგრამ ის, რაც ქსელში გადის — URL-ები, ველები, სტატუს-კოდები — ახლა უკვე ყველა დანარჩენის დასაყრდენია. კარგი API დიზაინი არის დისციპლინა, რომელიც ამ დაპირებას ადვილად წასაკითხს, ძნელად არასწორად გამოსაყენებელს და უსაფრთხოდ გასაზრდელს ხდის.
კლიენტი დამოკიდებულია კონტრაქტზე, და არა თქვენს კოდზე. შეინარჩუნეთ კონტრაქტი სტაბილურად და მის უკან ყველაფრის რეფაქტორინგი შეგეძლებათ.
კლიენტი, რომელსაც არასდროს შეხვდებით, შეიძლება იმ ველზე იყოს დამოკიდებული, რომელსაც პრივატულად თვლიდით.
საუკეთესო API ის არის, რომელსაც დეველოპერი პირველივე ცდაზე სწორად გამოიცნობს.
გახადეთ სწორი გამოძახება აშკარა, სახიფათო კი — მოუხერხებელი ან შეუძლებელი.
ყოველი შეუსაბამობა არის წინადადება, რომელიც ვიღაცამ უნდა დაწეროს — და კიდევ ერთმა ადამიანმა უნდა წაიკითხოს.
REST-ის მთავარი ხრიკი პატარაა, მაგრამ ძლიერი: თქვენი URL-ები ასახელებს საგნებს (რესურსებს), HTTP მეთოდი კი ამბობს, რას აკეთებთ ამ საგანთან. GET /orders/42 კითხულობს შეკვეთა 42-ს; DELETE /orders/42 შლის მას. აღარ იგონებთ ახალ ენდპოინტს ყოველი ქმედებისთვის და ეყრდნობით რამდენიმე მეთოდს, რომელიც ყველამ უკვე იცის.
მრავლობითი სახელები, კუთვნილების მიხედვით ჩადგმული. იგივე ხუთი ზმნა მუშაობს ყველა დონეზე — ყოველი რესურსისთვის ახალი ლექსიკა აღარ გჭირდებათ.
/orders და არა /getOrder. ზმნა უკვე მეთოდშია./orders/42/items კარგია; ხუთი დონე უკვე ცუდი ნიშანია./shipping-addresses, არასდროს /ShippingAddresses.PUT ცვლის მთელ რესურსს; PATCH — მის ნაწილს. აგზავნით მხოლოდ იმ ველებს, რომლებიც შეიცვალა? ეს PATCH-ია.
"გამოქვეყნება" ან "თანხის დაბრუნება" ზმნაზე არ აისახება. დაამოდელეთ ისინი ქვე-რესურსად — POST /orders/42/refunds — და არა /refundOrder.
2xx წარმატება, 4xx გამომძახებლის ბრალი, 5xx თქვენი. არასდროს დამალოთ შეცდომა 200-ის შიგნით.
REST, GraphQL და gRPC რეიტინგი არ არის — ისინი პასუხებია სხვადასხვა შეკითხვაზე იმის შესახებ, ვინ და როგორ გიძახებთ. გუნდების უმეტესობამ REST-ით უნდა დაიწყოს და დანარჩენებს მაშინ მიმართოს, როცა კონკრეტული ტკივილი გამოჩნდება: REST-ის ზედმეტი მონაცემების წამოღება ან შიდა ქსელის შეყოვნების ბიუჯეტი.
REST-ს შეუძლია ზედმეტი მონაცემი წამოიღოს და ერთი ეკრანისთვის რამდენიმე გამოძახება მოითხოვოს; GraphQL ამას ერთ, ზუსტად ჩამოყალიბებულ მოთხოვნად კეცავს.
curl-ით დებაგირებადი, ყველასთვის გასაგები. სწორი პასუხი საჯარო API-ების უმეტესობისთვის.დადებითი — უნივერსალური, HTTP შრეზე ქეშირებადი, ადვილად დებაგირებადი, უზარმაზარი ეკოსისტემა.
უარყოფითი — ზედმეტი ან ნაკლები წამოღება; ერთი ეკრანი შეიძლება რამდენიმე გასვლას ნიშნავდეს; ჩაშენებული სქემა არ აქვს.
აირჩიეთ საჯარო API-ებისთვის, ფართო მოცვისთვის და ყველაფრისთვის, რისი ქეშირებაც ან curl-ით გამოძახებაც გინდათ.
დადებითი — კლიენტი ზუსტ ველებს ირჩევს; ერთი გასვლა მრავალფეროვანი ინტერფეისისთვის; ძლიერი ტიპიზებული სქემა.
უარყოფითი — ქეშირება, სიხშირის ლიმიტი და N+1 შეკითხვები თქვენი პრობლემა ხდება; სერვერის სირთულე იზრდება.
აირჩიეთ მდიდარი, კლიენტზე ორიენტირებული ფრონტენდებისა და ბევრი წყაროს შემკრები BFF-ებისთვის.
დადებითი — სწრაფი HTTP/2 ბინარული, მკაცრი protobuf სქემა, სტრიმინგი, გენერირებული კლიენტები ბევრ ენაზე.
უარყოფითი — ბრაუზერისთვის ბუნებრივი არაა (სჭირდება gRPC-Web); თვალით ძნელი წასაკითხია; ინსტრუმენტები უფრო მძიმეა.
აირჩიეთ შიდა, სერვისიდან სერვისზე ტრაფიკისთვის მკაცრი შეყოვნების ბიუჯეტით.
თითქოს მენიუ, თვითშედგენილი კერძი და მუდმივი შეკვეთა: REST მზა კერძებს გაწვდით, GraphQL თითოეულ სტუმარს თავისი თეფშის შედგენის საშუალებას აძლევს, gRPC კი წინასწარ შეთანხმებული კონტრაქტია სამზარეულოსა და მის მომწოდებლებს შორის. თუ ეჭვობთ, დაიწყეთ REST-ით — დანარჩენების დამატება იქ შეგიძლიათ, სადაც ისინი თავს ამართლებენ.
პირველივე ჯერზე, როცა კოლექციაში ათი ათასი სტრიქონი აღმოჩნდება, ენდპოინტი, რომელიც "ყველას" აბრუნებს, ვარდება. პაგინაცია, ფილტრაცია და შეცდომის თანმიმდევრული ფორმა ის მოსაწყენი დეტალებია, რომლებზეც არის დამოკიდებული, გაუძლებს თუ არა თქვენი API რეალურ მონაცემებს — ამიტომ ისინი წინასწარ დააპროექტეთ და არა ინციდენტის შემდეგ.
offset-ს შეუძლია სტრიქონები გამოტოვოს ან გააორმაგოს, თუ სია სქროლის შუაში შეიცვალა; კურსორი კი რეალურ სტრიქონს ეჭიდება და პირდაპირ მასთან გადადის.
?status=paid&created_after=2026-01-01. სახელები თქვენს ველების სახელებს შეუსაბამეთ.?sort=-created_at (წინ დასმული - ნიშნავს კლებადობას) ხუთ სპეციალურ ფლაგზე უკეთესია.limit სერვერის მხარეს. კლიენტმა, რომელიც 1,000,000-ს ითხოვს, ჩუმად თქვენი მაქსიმუმი უნდა მიიღოს.ერთი პროგნოზირებადი შეცდომის კონვერტი მთელ API-ზე სჯობს ყოველ ენდპოინტზე სხვადასხვა ფორმას. RFC 9457 სწორედ ეს სტანდარტული ფორმაა.
ჩადეთ სტაბილური code სტრიქონი, რომელზეც კლიენტები დატოტვას შეძლებენ. ადამიანისთვის განკუთვნილი detail ტექსტი შეიცვლება; კოდი — არა.
400 გაფუჭებული ფორმა, 401/403 წვდომა, 404 არ არსებობს, 409 კონფლიქტი, 422 ვალიდაცია. სტატუსი და სხეული ერთმანეთს უნდა ეთანხმებოდეს.
შეცდომის სხეულში არც სტეკის ტრეისი და არც SQL. დეტალები სერვერზე დაალოგეთ; გამომძახებელს კი მოწესრიგებული, უსაფრთხო ფორმა დაუბრუნეთ.
ყოველი ინტეგრირებული კლიენტი გაყინულია იმ კონტრაქტზე, რომლისთვისაც კოდი დაწერა. ვერსიონირების ყველაზე იაფი სტრატეგია ის არის, რომ ახალი ვერსია თითქმის არასდროს დაგჭირდეთ — API შეცვალეთ ისე, რომ არსებული გამომძახებლები ვერ გატყდნენ. როცა მართლა რაღაცის გატეხვა გიწევთ, გააკეთეთ ეს ღიად და გრაფიკით.
არასავალდებულო ველის დამატება არავის ვნებს. მისი გადარქმევა ან წაშლა კი ჩუმად ტეხს ყველა კლიენტს, რომელიც ჯერ კიდევ ძველ სახელს კითხულობს.
/v1/orders. პირდაპირი, მაგრამ აშკარა, ადვილად ქეშირებადი და მარშრუტიზირებადი. ყველაზე გავრცელებული არჩევანი.Accept: application/vnd.acme.v2+json ან თარიღზე დაფუძნებული ვერსიის ჰედერი. URL-ებს სუფთად ტოვებს; სამაგიეროდ დანახვა და ტესტირება უფრო რთულია.მონიშნეთ ველი მოძველებულად, გააგზავნეთ Deprecation / Sunset ჰედერი და კლიენტებს რეალური დრო მიეცით, სანამ ის გაქრება.
კლიენტებმა უცნობი ველები უნდა უგულებელყონ და არ გაიგუდონ მათზე — სწორედ ეს ხდის დამატებით ცვლილებებს უსაფრთხოს.
/v1 → /v2 ნორმალურია; ახალი ვერსია ყოველ კვარტალში კი მხარდაჭერის კოშმარია. ვერსიები იშვიათი და ხანგრძლივი გახადეთ.
რეალურ ქსელებში პასუხები იკარგება, კლიენტები იმეორებენ მოთხოვნას და ყველა, ვინც გიძახებთ, კეთილგანწყობილი არაა. საჯარო API-ს სანდოობას სამი მექანიზმი ინარჩუნებს: იდემპოტენტურობა, რომ გამეორებულმა ჩაწერამ ორჯერ არ ჩამოჭრას თანხა, სიხშირის ლიმიტი, რომ ერთმა გამომძახებელმა დანარჩენები არ დააშიმშილოს, და ავთენტიფიკაცია, რომ იცოდეთ, ვინ არის ხაზზე.
GET, PUT და DELETE განსაზღვრებით იდემპოტენტურია; POST — არა. ამიტომ POST-ისთვის, რომელიც თანხას ჭრის, კლიენტი აგზავნის იდემპოტენტურობის გასაღებს, სერვერი კი შედეგს იმახსოვრებს და მეორედ ჭრის ნაცვლად თავდაპირველ პასუხს აბრუნებს.ხელახალი მცდელობა იმავე Idempotency-Key-ს ატარებს; სერვერი ცნობს მას და შენახულ შედეგს იმეორებს — ერთი ჩამოჭრა და არა ორი.
პატერნი Stripe-მა გაავრცელა; Idempotency-Key ჰედერი დღეს გავრცელებული წესია იმ ჩაწერებისთვის, რომელთა გამეორებაც უსაფრთხოა.
429 Too Many Requests და Retry-After ჰედერი, რომ კლიენტმა თავაზიანად დაიხიოს.RateLimit-* პასუხის ჰედერებით (ლიმიტი, ნარჩენი, განულების დრო), რომ კარგმა კლიენტებმა თავად შეიზღუდონ თავი.Authorization: Bearer …-ში TLS-ზე — არასდროს URL-ში, სადაც ისინი ლოგებსა და ისტორიაში ხვდება.ტოკენების ვედრო: მოთხოვნები ტოკენებს ხარჯავს, ვედრო მუდმივად ივსება, ცარიელი ვედრო კი 429-ს აბრუნებს დაცდის მინიშნებით.
ყველაზე საიმედო API-ები დაწერილი კონტრაქტის სახით იქმნება მანამ, სანამ ჰენდლერის ერთი ხაზი მაინც არსებობს. მანქანურად წასაკითხი სპეციფიკაცია ხდება ჭეშმარიტების ერთადერთი წყარო — დოკუმენტაცია, კლიენტის SDK-ები, მოკ სერვერები და მოთხოვნის ვალიდაცია მისგან მოედინება, და ყველა ფორმაზე თანხმდება მანამ, სანამ ვინმე მას ააგებს.
ერთი სპეციფიკაცია, ბევრი არტეფაქტი. დააგენერირეთ დოკუმენტაცია, SDK-ები, მოკები და ვალიდაცია, ნაცვლად იმისა, რომ თითოეული ხელით მოვლოთ.
აირჩიეთ ჭეშმარიტების წყაროდ ნებისმიერი REST API-სთვის, რომელსაც სხვებიც გამოიყენებენ.
აირჩიეთ API-ს ხელით მოსინჯვის, დებაგირებისა და ინტეგრაციული ტესტირებისთვის.
აირჩიეთ მაშინ, როცა კონტრაქტი შიდა სერვისებს შორისაა gRPC-ზე და არა საჯარო HTTP-ზე.
ხუთი სწრაფი შეკითხვა REST-ის წესებზე, პროტოკოლის არჩევანზე, პაგინაციაზე, ვერსიონირებასა და იდემპოტენტურობაზე — მყისიერი პასუხი, შესვლის გარეშე.
ნავიგაცია ← → ღილაკებით ან სქროლით · უკან ბიბლიოთეკაში