شاید خیلی جاها از API نوشته شده باشه ولی خب، این هم نوشتهی من :دی

اول از همه، من شاید دو سه ساله که اسم API رو میشنوم و میدونستم که خیلی استفاده میشه ولی هیچوقت نرفتم تا ببینم واقعا چیه و به یه تعریف یه خطیِ ویکیپدیایی بسنده کردم؛ تا مدتی پیش. مثالهای این نوشته از جنگو و طبیعتا پایتون هست؛ چون اخیرا خیلی درگیرش هستم! و همچنین چون خوانایی راحتی برای اکثر افراد (و نویسایی راحتی واسه من :)) داره.
به پیچیدگیها و فرمالیتهها دقت نکنید. هر چیزی که فکر میکنید براتون جالبه رو بگیرید و برین دنبالش بگردید و به قول معروف تهشو دربیارید :)
جوابِ این سوال که API چیه؟ یه راه حل! شاید هم یه نوع راه حل.
مخفف Application Programming Interface هست و اسمش حاکی از اینه که یک لایه هست در اپلیکیشنها. مثال خوبی که میشه پیدا کرد اینه که فرض کنیم یه برنامه ساختین که لیستی از محصولات موجود تو انبار کارخونهاتون رو میسازه و حالا میخواین اطلاعات یه سری از کالاها رو ببینین.
تو حالت عادی باید یه دیتابیس بسازین که توش تکتک کالاها ساخته میشن، اطلاعاتشون ثبت میشه، روابطشون با همدیگه تعریف میشه و بعدش میشه با کوئریها از این دیتابیس استفاده کرد؛ مثلا دید فلان تلویزیون تو چه تاریخی به انبار اضافه شده. راه حل سخت اینه که هر دفعه کوئری رو execute کنین و اطلاعات رو ببینین. یه چیزی به زشتیِ مثلا:
SELECT Name, ProductNumber, Price FROM Production.Product WHERE ProductType = 'TV' AND Serial# = a918
توضیحاتِ غیرضروری، اینکه تو خط اول میگیم بیا اسم، شماره و قیمت کالا رو نشون بده؛
خط دوم: کدوم کالاها؟ اونایی که تو جدول Product قبلا ثبت شدهان.
خط سوم: باشه تو جدول میگردم. چه کالاهایی رو نشون بدم؟ از بین اونایی که از نوع TV هستن بگرد و اونی که شماره سریالش a918 هست.
هر دفعه باید همین کار رو انجام بدیم که طبیعتا خستهکننده هست و با عقل سلیم جور در نمیاد و چه بسا این مثال کاملا غیرواقعی و دور از انتظاره. در موارد واقعی سرسامآور میشه:>
حالا راه حل چیه؟ API!
راه حلمون میتونه خیلی چیزای مختلفی باشه. در حقیقت اصلا مهم نیست که چجوری مشکل رو حل میکنیم و تا وقتی که نتیجه موردنظر رو بده، درسته. در حقیقت همین مسئلهاس که باعث میشه بهش بگیم راه حل. چون سختیهای بینراهی رو برای کسی که لازمش نداره (یا گاها اجازه دسترسی بهش رو نداره!) حذف میکنه.
تو مثالمون ممکنه یه راه حل این باشه که بیایم یه تابع تعریف کنیم که چندتا ورودی میگیره و کل اطلاعات رو در قالب یه فایل (معمولا json یا حتی yaml) ارسال میکنه. یه تابع مثل زیر:
def productInfo(type, serialNumber): url = 'http://api.example.com/products' params = {'serial#: serialNumber, 'category': type} r = requests.get(url, params=params) products = r.json() result = {'products': products['results']} return result
این تابع بطور خلاصه به یه آدرس یه درخواست GET میده و نتایج به دست اومده رو فرمت میکنه و برمیگردونه. حالا قسمت قشنگ ماجرا که فراخوانی یا API call هست اینطوری انجام میشه که کاربر توی ترمینال خودش مثلا مینویسه:
productInfo('Product.TV', 'a918')
که 'Product,TV' رو به عنوان type و a918 رو به عنوان serialNumber به تابع میده و نتیجه رو میگیره.
یا اینکه بسته به تابع استفاده شده از curl استفاده میکنه و همچین چیزی رو وارد میکنه:
curl -i -L --user <token> \ GET -X https://www.api.sample.com/products/tv/a918
در هر صورت نتیجه یه چیزی مثل زیر میشه:
{ "comment": "added 4 items on 24Jan2019", "tags": null, "character_limit": null, "reviews": 18, "user": "dummy", "source_string": "LG SmartTV a918", "translation": "تلویزیون هوشمند الجی مدل a918", "last_update": "2020-1-16T16:17:19" }
که شامل یه سری attributeها و مقادیر براشون هست.
تادا! کاری که میخواستیم رو کردیم رو اطلاعات کالا رو با یه فراخونی به دست آوردیم.
فرض کنید تولد بچهاتونه و غروب قراره مهمونی داشته باشید و چند نفر بیان و خوش بگذرونن(از ادامه دادن خودداری میکنم چون زیاد نمیدونم مهمونی تولد چجوریه و ممکنه جزییات نامربوط بدم :) ) و لازمه که برید و از قنادی شیرینی بخرید. میرید داخل مغازه و به لیست شیرینیها نگاه میاندازید و شیرینی موردنظرتون رو پیدا میکنید. حالا وقتشه برید و سفارش بدید. بعد از سفارش شیرینی رو میارن وبستهبندی میکنن و تحویلتون میدن و هزینهاش به صندوق پرداخت میشه. در آخر برمیگردید خونه و خوش میگذرونید(در مورد من "خوش میگذرونند" ولی باشه). بدون اینکه بدونید شیرینی داخل جعبه چطوری تهیه شده یا از کجا اومده یا مواد تشکیلدهندهاش چیه. تا جاییکه خوشمزه، سالم، تمیز(یا تحت هر شرایطی که مدنظرتون هست) باشه کارتون راه میافته.
در حقیقت API هم کاری به اینکه شما چجوری از خروجیش استفاده میکنید نداره. شما میتونین بعد از اینکه رسیدید خونه شیرینیها رو بخورید، پرت کنید تو صورت همکلاسی بچهاتون یا دفنش کنید. آقای /خانم شیرینیفروش دخالتی نخواهد کرد. (البته اگه شیرینیفروش مذکور همسرتون نباشه)
موارد دیگهای هم هستن که شما حق ندارید چیزی از پشت پرده بدونید. مثلا اگه برید Crusty Crab و یه همبرگر سفارش بدید. مثل داستان آقای خرچنگ و همبرگری که میتونین سفارش بدین ولی حق ندارین دستورپختشو بدونین. برگردید به ابتدای صفحه :>

نظراتتون رو تو قسمت کامنتها میخونم. خوش بگذره :دی