<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>نوشته های Amirreza saki</title><link>https://virgool.ir/feed/@amirreza.saki</link><description></description><language>fa</language><pubDate>2026-11-12 05:55:15</pubDate><image><url>https://files.virgool.ir/upload/users/207547/avatar/4Yjagt.jpeg</url><title>Amirreza saki</title><link>https://virgool.ir/@amirreza.saki</link></image><item><title>محدود کردن ریکوئست ها به یک API در GIN</title><link>https://virgool.ir/@amirreza.saki/محدود-کردن-ریکوئست-ها-به-یک-api-در-gin-avrakzmdwsli</link><description>خیلی وقتا ممکنه پیش بیاد که بخوایید یه endpoint (یا شایدم کل api ) رو محدود کنید که مثلا فلان ایپی بشتر از فلان تعداد ریکوئست برای یک روز نتونه بزنه.خب حالا راه حل چیه ؟ کار خیلی راحتیه و کار سختی نیست کافیه توی پروژه go-gin تون یه middleware اضافه کنید. البته اینم یگم که مثل هر چیز دیگه ایی این کارم احتمالا صد ها روش برای انجام دادنش وجود داره ، مثلا شما میتونید همین کارو توی کانفیگ nginx  ام انجام بدید.خب توضیحات بسه بریم middleware رو بنویسیم، پروژتون رو باز کنید و توی بخش middleware ها( که بستگی به شما داره کجا middleware ها رو مینویسید ، مثلا ممکنه یکی توی دایرکتوری به اسم middleware این کارو انجام بده ) یه فایل به اسم دلخواه مثلا LimitIPMiddleware.go بسازید و توش کدای زیر رو بنویسید :همونطور که میبینید دیگه کاری خاصی نمونده کافیه روی api مورد نظرتون اونو اضافه کنید. اینطوری :حالا کد اینطوری کار میکنه که هرکی که درخواست میده ایپی شو توی دیتابیس ردیس ( اگه نمیدونید ردیس چیه اینجا یه سر بزنید ) به یه تعدادی (دلخواه) ذخیره میکنه و هر بار(با هر ریکوِست) یکی ازش کم میکنه تا اینکه صفر بشه و در این صورت خروجی با status code too many request ارسال میشه.قطعا راهای دیگه ایی برای انجام اینکار وجود داره و این یه نوع ساده اش بود . امیدوارم مفید بوده باشه.موفق باشید.</description><category>Amirreza saki</category><author>Amirreza saki</author><pubDate>Fri, 30 Jul 2021 02:07:18 +0430</pubDate></item><item><title>ارسال ایمیل با GOlang</title><link>https://virgool.ir/coderlife/ارسال-ایمیل-با-golang-oflp7xqvpdb4</link><description>در کل ارسال ایمیل با golang (یا هر زبون دیگه ایی) کار اسونیه و روش ها و پکیج های مختلفی برای انجامش وجود داره من از پکیج net/smtp استفاده میکنم تا ایمیل هامو از طریق پروتکل smtp ارسال کنم.داکیومنت اصلی پکیجو میتونید اینجا ببینید.حالا بیایید با هم یه کد بزنیم که برامون ایمیلمون رو ارسال کنه.اولین کاری که نیازه انجام بدید اینه که یه پوشه بسازید و توش با دستور go mod init پروژتونو initialize کنید. مثل چیزی که اینجا نوشتم :حالا یه فایل به اسم main.go بسازید و توش کدای زیر رو بنویسین :توی کد بالا ما یه ایمیل با با پیام the body of email رو برای گیرنده ارسال کردیم فقط توجه داشته باشید که ما از جیمیل برای ارسال ایمیلمون استفاده کردیم برای همینم از سرور smtp جیمیل استفاده کردید. حالا باید یه نکته دیگه رو هم در نظر بگیرید اونم اینه که جیمیل ها به صورت پیش فرض برای امنیت بیشتر یه قابلیتی دارن که به برنامه های third-party اجازه ندن که باهاشون ایمیل ارسال کنیم برای همینم باید اول بریم توی تنظیمات جیمیل (قطعا فرسنده منظورمه) و اون گزینه رو موقتی غیر فعال کنیم که بعدش بتونیم با برنامه خودمون ایمیلا رو ارسال کنیم.برای فعال کردن این گزینه (allow less secure apps) میتونید از این لینک استفاده کنید. و یا تو گوگل سرچ کنید :‌ how to turning on allow less secure apps in gamilدر کل نوشتن کل برنامه توی تابع main زیاد کار جالبی نیست و هر بار برای ارسال ایمیل متفاوت باید خود کدو تغییر بدیم برای همین من اونو این شکلی به صورت یک تابع در اوردم که هر جای برنامه خواستیم ازش استفاده کنیم :حالا هر جای برنامه که نیاز به ارسال ایمیل باشه کافیه تابع رو صدا بزنیم .ولی بعضی وقتا نیازه که فقط یه پیام رو توی ایمیل ارسال نکنیم بلکه یه ایمیل به صورت template.html ارسال کنیم که برای اینکار نیاز به ابزاری داریم که برامون فایل html رو رندر کنه برای همین از text/template استفاده میکنیم و چیزی شبیه به کد زیر میشه :فقط توجه داشته باشید که template _name در واقع اسم یه فایل html توی همون پوشه است یعنی اگه لیست فایل های داخل پوشه مون رو بگیریم اینطور چیزی برمیگردونه :ls &#xA;main.go        template.htmlو همچنین data که از ورودی گرفته میشه رو پاس میده به فایل html و توی فایل html میتونید از متغیرا اینطوری استفاده کنید : که کلید Hello در واقع کلید همون چیزیه که توی map دیتا ارسال کردیم.شاد و موفق باشید.</description><category>Amirreza saki</category><author>Amirreza saki</author><pubDate>Thu, 10 Jun 2021 17:03:01 +0430</pubDate></item><item><title>مقدمه ایی بر فریم ورک gin (gin-gonic web framework)</title><link>https://virgool.ir/golangpub/مقدمه-ایی-بر-فریم-ورک-gin-gin-gonic-web-framework-skssyoumcvcx</link><description>gin gonicهمونطور که میدونید یا نمیدونید gin-gonic یکی از فریم ورک های زبان go یا بهتره بگم golang هست و اگه نمیدونید فریم ورک چیه میتونید از لینک های زیر استفاده کنید :https://en.wikipedia.org/wiki/Web_frameworkhttps://zerotohero.ir/article/web-development/%D9%81%D8%B1%DB%8C%D9%85-%D9%88%D8%B1%DA%A9-%D9%88%D8%A8-%DA%86%DB%8C%D8%B3%D8%AA-%D9%88-%DA%86%D8%B1%D8%A7%D8%9F/https://hackr.io/blog/what-is-frameworksاگه بخواییم خیلی خلاصه بگیم فریم ورک یه چارچوب یا یه پایه است که باعث شده کارای تکراری که توی همه ی برنامه های اون حوزه(مثلا وب) انجام میشه رو انجام ندیم و از اونجایی که ما ادم های تنبلی هستیم و معمولا افراد با تجربه ایی این فریم ورک ها رو ساختن پس استفاده از اونا خیلی توصیه میشه چون باعث میشه درگیر یه سری کارای تکرای یا خیلی پایه ایی نشین.حالا که تقریبا فهمیدیم فریم ورک چیه وقتشه که با gin که فریم ورک وب زبان go هست اشنا بشیم و یه سری نمونه کد بزنیم.تعریفی که توی ریپوزیتوری اصلی خود gin هست اینه : این لینک سایت رسمیشه و این لینکش توی گیت هابهGin is a web framework written in Go (Golang). It features a martini-like API with much better&#xA;performance, up to 40 times faster thanks to httprouter. If you need performance and good&#xA;productivity, you will love Gin.به زبان ساده ، Gin یک میکرو فریم ورک Go مبتنی بر httprouter  که خدمات API مشابه martini (یکی دیگه از فریم ورک های go) اما با عملکرد بهتره.جین سرعت بالایی داره و دارای قابلیت های خیلی خوبی مثل مدیریت ارور (error handling)، پشتیبانی از میان افزار ها (Middlewares) و پردازش json برخورداره که باعث میشه سرعتتون بالا بره و به همین دلایله که استفاده ازش توصیه میشه.میتونیم از نتایج بنچ مارک چنتا از فریم ورک های go برای مقایسه gin با بقیه فریم ورک های رقیبش هم که توی ریپوزیتوریه اصلیش اومده هم استفاده کنیم که جوری که این امار نشون میده مثل اینکه gin نسبت به بقیه فریم ورک ها امتیاز بیشتری داره.https://github.com/gin-gonic/ginالبته گفتن این نکته ضروریه که این چنین مقایسه ها ممکنه یه جور جبهه گیری بوجود بیارن که خیلی عوامل دیگه روی سرعت و کیفیت یه API تاثیر گذارن که فقط یکیشون فریم ورکه پس اینجور مقایسه ها زیادم مهم نیستن.خب حالا وقتش رسیده یه خورده کد بزنیم ببینیم چطور کار میکنه :اول از همه باید خود زبان go رو روی سیستمتون نصب کرده باشید . اگه نصبش نکردید میتونید از سایت اصلیش دانلود کنید و نصب کنید :https://golang.org/doc/installبعدش یه پوشه میسازیم و go mod init go-intro رو میزنیم تا پروژمون initialize بشه و بتونیم پروژمون رو پکیج بندی کنیم و در نهایت باید gin رو با استفاده از go نصب کنید که یه چیزی شبیه به زیر میشه :حالا یه فایل به اسم main.go بسازید و با یه ادیتور اونو باز کنید و کدای زیر رو توش بنویسین : توی خط اول که پکیجو برای گو تعریف کردیم که با توجه به اینکه برنامه ما از تابع main . پکیج main اجرا میشه پس اسم پکیجو main میذاریم.توی خط سوم gin رو که از طریق go get نصب کرده بودیم رو ایمپورت میکنیم تا بتونیم از function ها و struct هاش استفاده کنیم.توی خط ۷ ام ما یه متغیر به اسم router تعریف و مقدار دهی کردیم که همون روترمون هست و فانکشن دیفالت در واقع یه روتر میده میده که شامل دوتا میان افزار middleware خودشه.حالا روتر ما یه سری فانکشن داره که همون متد های http ان مثل POST, GET, PUT, PATCH, DELETE, ...  که هرکدومو که بزنید آرگمان اول یه رشته میگیره که همون مسیره api و پارامتر دوم یه فانکشنه که اینجا میشد یه فانکشن توی همین فایل ( یا کلا توی پکیج دیگه ) تعریف کرد بعد فقط اسمشو نوشت . مثل چیزی که این پایین نوشتم : اگه درست نمیدونید پروتوکل http چیه و متداش به چه دردی میخورن میتونید از این لینکایی که گذاشتم استفاده کنید :https://developer.mozilla.org/en-US/docs/Web/HTTP/Overviewhttps://developer.mozilla.org/en-US/docs/Web/HTTP/Methodsتوی کد بالا فانکشن هایی که به عنوان ورودی به یکی از متد های router اضافه میشن یه ارگمان میگیرن از جنس(خود) gin.Contex که یه struct از gin که یه سری متد داره برای خروجی دادن(به انواع فرمت ها که الان ما json رو انتخاب کردیم) و گرفتن ورودی(کوری پارامتر ها یا دیتا هایی که توی body ارسال میشن) که بعدا باهاشون کار میکنیم و آرگمان اولی که به فانکشن JSON دادیم (200) همون http Status Code ما هست که اینجا موفقیت امیز بوده برای همین 200 . لیست status code ها رو میتونید اینجا ببینید.حالا اگه دستور go run main.go رو بزنیم برنامه مون اجرا میشه :و میتونید توی مرورگرتون localhost:8080/home رو بزنید تا خروجی رو بهتون نشون بده.این لاگ هایی که توی ترمینال میبینید در واقع به خواطر یه middleware که توی خود gin هست و بالا تر که گفتم router.Default شامل ۲ تا middleware میشه یکیشون همینه اسمش logger حالا بعدا خودمون میتونیم middleware تعریف کنیم و استفاده کنیم.خب حالا ما یه api خیلی ساده ساختیم که فقط یه api داره اونم یه json خروجی میده. برای اینکه api پیشرفته ایی بسازیم باید یه سری ساختار و پوشه بندی(پکیج) به برنامه مون اضافه کنیم که ما از معماری MVC برای ساخت api هامون استفاده میکنیم که همون ساختارمونه.حالا اگه نمیدونید فرمت json چطوریه میتونید از لینکهای زیر استفاده کنید:https://www.w3schools.com/whatis/whatis_json.asphttps://blog.faradars.org/json-overview/و اگه نمیدونید معماری MVC چطوره و middleware کجای کار قرار میگیره از لینکای زیر استفاده کنید:https://blog.faradars.org/mvc-%DA%86%DB%8C%D8%B3%D8%AA-%D8%9F/https://www.educative.io/blog/mvc-tutorialنمای کلی معماری MVCدر ادامه سعی میکنم طی چند قسمت چگونگی ساخت یه api نسبتا پیشرفته رو توضیح بدم.شاد و موفق باشید.</description><category>Amirreza saki</category><author>Amirreza saki</author><pubDate>Sun, 30 May 2021 20:23:32 +0430</pubDate></item></channel></rss>