paint-brush
ফাস্টএপিআই আমাকে একটি ওপেনএপিআই স্পেক দিয়েছে... দ্রুতদ্বারা@johnjvester
2,021 পড়া
2,021 পড়া

ফাস্টএপিআই আমাকে একটি ওপেনএপিআই স্পেক দিয়েছে... দ্রুত

দ্বারা John Vester16m2024/04/22
Read on Terminal Reader

অতিদীর্ঘ; পড়তে

যখন এপিআই ফার্স্ট একটি বিকল্প নয়, তখন ফাস্টএপিআই বিদ্যমান RESTful মাইক্রোসার্ভিসগুলিকে সম্পূর্ণরূপে নথিভুক্ত এবং স্বয়ংক্রিয়ভাবে OpenAPI v3 ব্যবহার করে ব্যবহার করার অনুমতি দিয়ে টিমের সময় বাঁচাতে পারে।
featured image - ফাস্টএপিআই আমাকে একটি ওপেনএপিআই স্পেক দিয়েছে... দ্রুত
John Vester HackerNoon profile picture

আমার প্রকাশনাগুলির পাঠকরা সম্ভবত মাইক্রোসার্ভিসগুলি বিকাশের জন্য একটি API প্রথম পদ্ধতির নিয়োগের ধারণার সাথে পরিচিত। অগণিত বার, আমি প্রত্যাশিত URI এবং অন্তর্নিহিত অবজেক্ট মডেলগুলি বর্ণনা করার সুবিধাগুলি উপলব্ধি করেছি যে কোনও বিকাশ শুরু হওয়ার আগে৷


আমার 30+ বছরের নেভিগেটিং প্রযুক্তিতে, যাইহোক, আমি বিকল্প প্রবাহের বাস্তবতা আশা করতে এসেছি। অন্য কথায়, আমি সম্পূর্ণরূপে এমন পরিস্থিতিতে আশা করি যেখানে API প্রথমটি সম্ভব নয়।


এই নিবন্ধটির জন্য, আমি একটি উদাহরণের মধ্য দিয়ে যেতে চেয়েছিলাম যে কীভাবে মাইক্রোসার্ভিস উৎপাদনকারী দলগুলি একটি OpenAPI স্পেসিফিকেশন প্রদান করতে সফল হতে পারে অন্যদের জন্য একটি openapi.json ফাইলকে ম্যানুয়ালি সংজ্ঞায়িত না করে ব্যবহার করার জন্য।


আমি আমার কমফোর্ট জোনের বাইরেও যেতে চেয়েছিলাম এবং Java, .NET, এমনকি JavaScript ব্যবহার না করেই এটি করতে চেয়েছিলাম।

ফাস্টএপিআই আবিষ্কার করা হচ্ছে

আমার বেশিরভাগ নিবন্ধের উপসংহারে, আমি প্রায়ই আমার ব্যক্তিগত মিশন বিবৃতি উল্লেখ করি:


“আপনার বৌদ্ধিক সম্পত্তির মূল্যকে প্রসারিত করে এমন বৈশিষ্ট্য/কার্যকারিতা প্রদানের উপর আপনার সময়কে ফোকাস করুন। অন্য সবকিছুর জন্য ফ্রেমওয়ার্ক, পণ্য এবং পরিষেবার সুবিধা নিন।" - জে. ভেস্টার


এই মিশনের বিবৃতিতে আমার বক্তব্য হল উচ্চ স্তরে সেট করা লক্ষ্য এবং উদ্দেশ্যগুলিতে পৌঁছানোর চেষ্টা করার সময় আমার সময়ের সর্বোত্তম ব্যবহার করার জন্য নিজেকে দায়বদ্ধ করা। মূলত, যদি আমাদের ফোকাস হয় আরও বেশি উইজেট বিক্রি করা, আমার সময়টা সম্ভব করার উপায় খুঁজতে ব্যয় করা উচিত - বিদ্যমান ফ্রেমওয়ার্ক, পণ্য বা পরিষেবাগুলির দ্বারা ইতিমধ্যেই সমাধান করা চ্যালেঞ্জগুলি থেকে পরিষ্কার করা।


আমি আমার নতুন মাইক্রোসার্ভিসের জন্য প্রোগ্রামিং ভাষা হিসাবে পাইথন বেছে নিয়েছি। আজ অবধি, আমার আগের নিবন্ধগুলির জন্য আমি যে পাইথন কোড লিখেছি তার 99% স্ট্যাক ওভারফ্লো ড্রাইভেন ডেভেলপমেন্ট (এসওডিডি) বা চ্যাটজিপিটি-চালিত উত্তরগুলির ফলাফল। স্পষ্টতই, পাইথন আমার আরাম জোনের বাইরে পড়ে।


এখন যেহেতু আমি লেভেল-সেট করেছি যেখানে জিনিসগুলি দাঁড়িয়েছে, আমি একটি নতুন পাইথন-ভিত্তিক RESTful মাইক্রোসার্ভিস তৈরি করতে চেয়েছিলাম যা উৎস ভাষায় ন্যূনতম অভিজ্ঞতা সহ আমার ব্যক্তিগত মিশন স্টেটমেন্ট মেনে চলে।


তখনই আমি ফাস্টএপিআই খুঁজে পাই।


ফাস্টএপিআই 2018 সাল থেকে রয়েছে এবং এটি একটি ফ্রেমওয়ার্ক যা পাইথন-টাইপ ইঙ্গিত ব্যবহার করে RESTful API সরবরাহ করার উপর দৃষ্টি নিবদ্ধ করে। ফাস্টএপিআই-এর সবচেয়ে ভালো অংশ হল ডেভেলপারের দৃষ্টিকোণ থেকে কোনো অতিরিক্ত প্রচেষ্টা ছাড়াই স্বয়ংক্রিয়ভাবে OpenAPI 3 স্পেসিফিকেশন তৈরি করার ক্ষমতা।

প্রবন্ধ API ব্যবহার কেস

এই নিবন্ধটির জন্য, একটি নিবন্ধ API এর ধারণাটি মাথায় এসেছিল, একটি RESTful API প্রদান করে যা গ্রাহকদের আমার সম্প্রতি প্রকাশিত নিবন্ধগুলির একটি তালিকা পুনরুদ্ধার করতে দেয়৷


জিনিসগুলি সহজ রাখতে, অনুমান করা যাক একটি প্রদত্ত Article নিম্নলিখিত বৈশিষ্ট্য রয়েছে:

  • id - সহজ, অনন্য শনাক্তকারী সম্পত্তি (সংখ্যা)
  • title - নিবন্ধের শিরোনাম (স্ট্রিং)
  • url - নিবন্ধটির সম্পূর্ণ URL (স্ট্রিং)
  • year - যে বছর নিবন্ধটি প্রকাশিত হয়েছিল (সংখ্যা)


নিবন্ধ API নিম্নলিখিত URI অন্তর্ভুক্ত করবে:

  • GET /articles - নিবন্ধগুলির একটি তালিকা পুনরুদ্ধার করবে
  • GET /articles/{article_id} - আইডি বৈশিষ্ট্য দ্বারা একটি একক নিবন্ধ পুনরুদ্ধার করবে
  • পোস্ট /articles - একটি নতুন নিবন্ধ যোগ করে

ফাস্টএপিআই ইন অ্যাকশন

আমার টার্মিনালে, আমি ফাস্ট-এপিআই-ডেমো নামে একটি নতুন পাইথন প্রকল্প তৈরি করেছি এবং তারপরে নিম্নলিখিত কমান্ডগুলি কার্যকর করেছি:


 $ pip install --upgrade pip $ pip install fastapi $ pip install uvicorn


আমি api.py নামে একটি নতুন পাইথন ফাইল তৈরি করেছি এবং কিছু আমদানি যোগ করেছি, পাশাপাশি একটি app ভেরিয়েবল প্রতিষ্ঠা করেছি:


 from fastapi import FastAPI, HTTPException from pydantic import BaseModel app = FastAPI() if __name__ == "__main__": import uvicorn uvicorn.run(app, host="localhost", port=8000)


এর পরে, আমি আর্টিকেল API ব্যবহারের ক্ষেত্রে মেলে একটি Article অবজেক্ট সংজ্ঞায়িত করেছি:


 class Article(BaseModel): id: int title: str url: str year: int


মডেলটি প্রতিষ্ঠিত হওয়ার সাথে সাথে, আমাকে ইউআরআই যুক্ত করতে হবে … যা বেশ সহজ হয়ে উঠেছে:


 # Route to add a new article @app.post("/articles") def create_article(article: Article): articles.append(article) return article # Route to get all articles @app.get("/articles") def get_articles(): return articles # Route to get a specific article by ID @app.get("/articles/{article_id}") def get_article(article_id: int): for article in articles: if article.id == article_id: return article raise HTTPException(status_code=404, detail="Article not found")


একটি বহিরাগত ডেটা স্টোরের সাথে জড়িত থেকে নিজেকে বাঁচাতে, আমি আমার সাম্প্রতিক প্রকাশিত নিবন্ধগুলি প্রোগ্রামগতভাবে যুক্ত করার সিদ্ধান্ত নিয়েছি:


 articles = [ Article(id=1, title="Distributed Cloud Architecture for Resilient Systems: Rethink Your Approach To Resilient Cloud Services", url="https://dzone.com/articles/distributed-cloud-architecture-for-resilient-syste", year=2023), Article(id=2, title="Using Unblocked to Fix a Service That Nobody Owns", url="https://dzone.com/articles/using-unblocked-to-fix-a-service-that-nobody-owns", year=2023), Article(id=3, title="Exploring the Horizon of Microservices With KubeMQ's New Control Center", url="https://dzone.com/articles/exploring-the-horizon-of-microservices-with-kubemq", year=2024), Article(id=4, title="Build a Digital Collectibles Portal Using Flow and Cadence (Part 1)", url="https://dzone.com/articles/build-a-digital-collectibles-portal-using-flow-and-1", year=2024), Article(id=5, title="Build a Flow Collectibles Portal Using Cadence (Part 2)", url="https://dzone.com/articles/build-a-flow-collectibles-portal-using-cadence-par-1", year=2024), Article(id=6, title="Eliminate Human-Based Actions With Automated Deployments: Improving Commit-to-Deploy Ratios Along the Way", url="https://dzone.com/articles/eliminate-human-based-actions-with-automated-deplo", year=2024), Article(id=7, title="Vector Tutorial: Conducting Similarity Search in Enterprise Data", url="https://dzone.com/articles/using-pgvector-to-locate-similarities-in-enterpris", year=2024), Article(id=8, title="DevSecOps: It's Time To Pay for Your Demand, Not Ingestion", url="https://dzone.com/articles/devsecops-its-time-to-pay-for-your-demand", year=2024), ]


বিশ্বাস করুন বা না করুন, এটি আর্টিকেল API মাইক্রোসার্ভিসের বিকাশ সম্পূর্ণ করে।


দ্রুত সুস্থতা যাচাইয়ের জন্য, আমি স্থানীয়ভাবে আমার API পরিষেবা চালু করেছি:


 $ python api.py INFO: Started server process [320774] INFO: Waiting for application startup. INFO: Application startup complete. INFO: Uvicorn running on http://localhost:8000 (Press CTRL+C to quit)


তারপরে, অন্য টার্মিনাল উইন্ডোতে, আমি একটি কার্ল অনুরোধ পাঠিয়েছি (এবং এটি json_pp এ পাইপ করেছি):


 $ curl localhost:8000/articles/1 | json_pp { "id": 1, "title": "Distributed Cloud Architecture for Resilient Systems: Rethink Your Approach To Resilient Cloud Services", "url": "https://dzone.com/articles/distributed-cloud-architecture-for-resilient-syste", "year": 2023 }


মোতায়েন করার প্রস্তুতি নিচ্ছে

শুধু স্থানীয়ভাবে Article API চালানোর পরিবর্তে, আমি ভেবেছিলাম আমি দেখতে পাব কত সহজে আমি মাইক্রোসার্ভিস স্থাপন করতে পারি। যেহেতু আমি আগে কখনও হেরোকুতে পাইথন মাইক্রোসার্ভিস স্থাপন করিনি, তাই আমার মনে হয়েছিল এখন চেষ্টা করার জন্য একটি দুর্দান্ত সময় হবে।


Heroku-এ ডুব দেওয়ার আগে, পরিষেবার জন্য নির্ভরতা বর্ণনা করার জন্য আমাকে একটি requirements.txt ফাইল তৈরি করতে হবে। এটি করার জন্য, আমি pipreqs ইনস্টল এবং কার্যকর করেছি:


 $ pip install pipreqs $ pipreqs


এটি নিম্নলিখিত তথ্য সহ আমার জন্য একটি requirements.txt ফাইল তৈরি করেছে:


 fastapi==0.110.1 pydantic==2.6.4 uvicorn==0.29.0


আমার Procfile নামে একটি ফাইলেরও প্রয়োজন ছিল যেটি Heroku কে বলে যে কিভাবে আমার মাইক্রোসার্ভিসকে uvicorn দিয়ে স্পিন করতে হয়। এর বিষয়বস্তু এই মত লাগছিল:


 web: uvicorn api:app --host=0.0.0.0 --port=${PORT}


আসুন হেরোকুতে স্থাপন করি

আপনারা যারা পাইথনে নতুন (যেমন আমি) তাদের জন্য আমি হেরোকুতে পাইথন ডকুমেন্টেশন সহ একটি সহায়ক গাইড হিসেবে ব্যবহার করেছি।


যেহেতু আমি ইতিমধ্যে Heroku CLI ইনস্টল করেছি, তাই আমার টার্মিনাল থেকে Heroku ইকোসিস্টেমে লগ ইন করতে হবে:


 $ heroku login


আমি গিটল্যাবে আমার সংগ্রহস্থলে আমার সমস্ত আপডেট চেক করা নিশ্চিত করেছি।


এরপরে, হেরোকুতে একটি নতুন অ্যাপ তৈরি করা নিম্নলিখিত কমান্ডের মাধ্যমে CLI ব্যবহার করে সম্পন্ন করা যেতে পারে:


 $ heroku create


CLI অ্যাপের URL এবং অ্যাপের সাথে যুক্ত গিট-ভিত্তিক সংগ্রহস্থল সহ একটি অনন্য অ্যাপ নাম দিয়ে প্রতিক্রিয়া জানিয়েছে:


 Creating app... done, powerful-bayou-23686 https://powerful-bayou-23686-2d5be7cf118b.herokuapp.com/ | https://git.heroku.com/powerful-bayou-23686.git


অনুগ্রহ করে মনে রাখবেন – আপনি এই নিবন্ধটি পড়ার সময়, আমার অ্যাপটি আর অনলাইনে থাকবে না।


এটা দেখ. যখন আমি একটি গিট রিমোট কমান্ড ইস্যু করি, আমি দেখতে পাচ্ছি যে একটি রিমোট স্বয়ংক্রিয়ভাবে হেরোকু ইকোসিস্টেমে যুক্ত হয়েছে:


 $ git remote heroku origin


Heroku এ fast-api-demo অ্যাপ স্থাপন করতে, আমাকে যা করতে হবে তা হল নিম্নলিখিত কমান্ডটি ব্যবহার করুন:


 $ git push heroku main


সবকিছু সেট করে, আমি যাচাই করতে সক্ষম হয়েছি যে আমার নতুন পাইথন-ভিত্তিক পরিষেবা Heroku ড্যাশবোর্ডে চালু এবং চলছে:


পরিষেবাটি চলার সাথে, নিম্নলিখিত কার্ল কমান্ডটি জারি করে আর্টিকেল API থেকে id = 1 সহ Article পুনরুদ্ধার করা সম্ভব:


 $ curl --location 'https://powerful-bayou-23686-2d5be7cf118b.herokuapp.com/articles/1'


কার্ল কমান্ড একটি 200 ওকে প্রতিক্রিয়া এবং নিম্নলিখিত JSON পেলোড প্রদান করে:


 { "id": 1, "title": "Distributed Cloud Architecture for Resilient Systems: Rethink Your Approach To Resilient Cloud Services", "url": "https://dzone.com/articles/distributed-cloud-architecture-for-resilient-syste", "year": 2023 }


স্বয়ংক্রিয়ভাবে OpenAPI 3 স্পেসিফিকেশন সরবরাহ করা হচ্ছে

ফাস্টএপিআই-এর অন্তর্নির্মিত OpenAPI কার্যকারিতা ব্যবহার করে ভোক্তাদের স্বয়ংক্রিয়ভাবে জেনারেট হওয়া /docs ইউআরআই-তে নেভিগেট করে সম্পূর্ণ কার্যকরী v3 স্পেসিফিকেশন পেতে দেয়:


 https://powerful-bayou-23686-2d5be7cf118b.herokuapp.com/docs


এই ইউআরএলে কল করলে ব্যাপকভাবে গৃহীত Swagger UI ব্যবহার করে আর্টিকেল API মাইক্রোসার্ভিস ফিরে আসে:


যারা একটি openapi.json ফাইল খুঁজছেন আর্টিকেল API ব্যবহার করার জন্য ক্লায়েন্ট তৈরি করতে, /openapi.json URI ব্যবহার করা যেতে পারে:


 https://powerful-bayou-23686-2d5be7cf118b.herokuapp.com/openapi.json


আমার উদাহরণের জন্য, JSON-ভিত্তিক OpenAPI v3 স্পেসিফিকেশন নীচে দেখানো হয়েছে:


 { "openapi": "3.1.0", "info": { "title": "FastAPI", "version": "0.1.0" }, "paths": { "/articles": { "get": { "summary": "Get Articles", "operationId": "get_articles_articles_get", "responses": { "200": { "description": "Successful Response", "content": { "application/json": { "schema": { } } } } } }, "post": { "summary": "Create Article", "operationId": "create_article_articles_post", "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Article" } } }, "required": true }, "responses": { "200": { "description": "Successful Response", "content": { "application/json": { "schema": { } } } }, "422": { "description": "Validation Error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/HTTPValidationError" } } } } } } }, "/articles/{article_id}": { "get": { "summary": "Get Article", "operationId": "get_article_articles__article_id__get", "parameters": [ { "name": "article_id", "in": "path", "required": true, "schema": { "type": "integer", "title": "Article Id" } } ], "responses": { "200": { "description": "Successful Response", "content": { "application/json": { "schema": { } } } }, "422": { "description": "Validation Error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/HTTPValidationError" } } } } } } } }, "components": { "schemas": { "Article": { "properties": { "id": { "type": "integer", "title": "Id" }, "title": { "type": "string", "title": "Title" }, "url": { "type": "string", "title": "Url" }, "year": { "type": "integer", "title": "Year" } }, "type": "object", "required": [ "id", "title", "url", "year" ], "title": "Article" }, "HTTPValidationError": { "properties": { "detail": { "items": { "$ref": "#/components/schemas/ValidationError" }, "type": "array", "title": "Detail" } }, "type": "object", "title": "HTTPValidationError" }, "ValidationError": { "properties": { "loc": { "items": { "anyOf": [ { "type": "string" }, { "type": "integer" } ] }, "type": "array", "title": "Location" }, "msg": { "type": "string", "title": "Message" }, "type": { "type": "string", "title": "Error Type" } }, "type": "object", "required": [ "loc", "msg", "type" ], "title": "ValidationError" } } } }


ফলস্বরূপ, নিম্নলিখিত স্পেসিফিকেশনটি OpenAPI জেনারেটরের মাধ্যমে বিভিন্ন ভাষায় ক্লায়েন্ট তৈরি করতে ব্যবহার করা যেতে পারে।

উপসংহার

এই নিবন্ধের শুরুতে, আমি যুদ্ধে যেতে এবং API প্রথম পদ্ধতি ব্যবহার করতে আগ্রহী নয় এমন কারও মুখোমুখি হতে প্রস্তুত ছিলাম। আমি এই অনুশীলন থেকে যা শিখেছি তা হল যে FastAPI-এর মতো একটি পণ্য দ্রুত একটি কার্যকরী RESTful মাইক্রোসার্ভিসকে সংজ্ঞায়িত করতে এবং উত্পাদন করতে সাহায্য করতে পারে এবং এছাড়াও একটি সম্পূর্ণরূপে ব্যবহারযোগ্য OpenAPI v3 স্পেসিফিকেশন সহ … স্বয়ংক্রিয়ভাবে।


দেখা যাচ্ছে, FastAPI দলগুলিকে তাদের লক্ষ্য এবং উদ্দেশ্যগুলির উপর ফোকাস থাকার অনুমতি দেয় এমন একটি কাঠামো যা অন্যদের উপর নির্ভর করার জন্য একটি মানসম্মত চুক্তি প্রদান করে। ফলস্বরূপ, আমার ব্যক্তিগত মিশন বিবৃতি মেনে চলার জন্য আরেকটি পথ দেখা দিয়েছে।


পথ ধরে, আমি পাইথন-ভিত্তিক পরিষেবা স্থাপনের জন্য প্রথমবারের মতো Heroku ব্যবহার করেছি। কিছু ভাল-লিখিত ডকুমেন্টেশন পর্যালোচনা করা ছাড়া এটি আমার পক্ষ থেকে সামান্য প্রচেষ্টার প্রয়োজন ছিল। তাই হেরোকু প্ল্যাটফর্মের জন্যও আরেকটি মিশন স্টেটমেন্ট বোনাস উল্লেখ করা প্রয়োজন।


আপনি যদি এই নিবন্ধটির উত্স কোডে আগ্রহী হন তবে আপনি এটি গিটল্যাবে খুঁজে পেতে পারেন।


একটি সত্যিই মহান দিন আছে!