توسعه REST API با استفاده از GoLang, Echo, MySql, JWT Token با معماری MVC
در این آموزش ساخت REST API در زبان GoLang و با استفاده از فریمورک Echo و دیتابیس MySql را فراخواهید گرفت. فرض بر این است که شما اصول و مبانی ابتدایی دیتابیس MySql را دانسته و با Querying در این دیتابیس آشنایی دارید.
مراحل کار به این صورت خواهد بود :
- ایجاد یک API ساده با استفاده از Echo
- اتصال GoLang به دیتابیس MySql
- اضافه کردن یک کاربر جدید در دیتابیس و دریافت JWT Token
ایجاد یک REST API ساده با استفاده از Echo
در این مرحله ابتدا فایلی با نام main.go ایجاد کرده و با دستور زیر فریمورک Echo را به پروژه اضافه میکنیم.
$ go get "github.com/labstack/echo"
همانطور که مشاهده میشود در این فایل و در بلاک import از پکیج utils که مربوط به همین پروژه است استفاده شده است. این پکیج مربوط به دایرکتوری utils همین پروژه است که شامل سه فایل response.go, translator.go و constants.go است که در ادامه بررسی خواهد شد.
خطوط ۵ تا ۱۰ فایل response.go ساختار کلی یک response که در پاسخ به یک request ارسال میشود قرار گرفته است. Result از نوع string بوده و میتواند هر مقدار دلخواهی داشته باشد. در این پروژه مقادیر SUCCESS و ERROR برای این آیتم در نظر گرفته شده است که نمایانگر موفقیت آمیز بودن یا نبودن response است. آیتم StatusCode از نوع int است که درواقع همان HTTP Status Code است که در بدنه response نیز ارسال شده است. آیتم Messages مربوط به پیغامی است که نمایش داده میشود و خود شامل آرایه ای از MessageItemهاست. MessageItem نیز ساختاری است که شامل یک یا چند string است. آیتم Data ساختاری است که محتوی آرایه ای از آبجکتها است و برای برگرداندن اطلاعات در response (به عنوان مثال لیست کاربران) استفاده میشود.
در فایل main.go و در خط ۱۳ متدی با نام GetMessageByKey وجود دارد. این متد در فایل translator.go در دایرکتوری utils قرار دارد که با دریافت یک key پیغام مربوط به آن را در قالب MessageItem در زبانهای مختلف برمیگرداند.
در این فایل ثابتی با نام NotFoundErrorMessageKey قرار دارد. این ثابت نیز در فایل constants.go و در دایرکتوری utils تعریف شده است. این فایل جهت نگهداری ثوابت استفاده میشود که در ادامه ثوابت دیگری نیز به آن اضافه خواهد شد.
با اجرای کد زیر در خط فرمان REST API بسیار ساده ای بدون هیچ rout تعریف شده ای خواهیم داشت. این سرویس در پاسخ به هر request پیغام not found را ارسال میکند که در خطوط ۱۱ تا ۱۴ فایل main.go تعریف کرده ایم. این API روی آدرس لوکال هاست و پورت دلخواه تعریف شده ۱۳۲۳ اجرا خواهد شد.
$ go run main.go
حال اگر در مرورگر یا نرم افزارهایی مثل PostMan آدرس localhost:1323 را فراخوانی کنیم در پاسخ response زیر را دریافت خواهیم کرد.
اتصال GoLang به دیتابیس MySql
جهت اتصال به دیتابیس MySql نیاز است تا ابتدا پکیج درایور آن را به پروژه اضافه کنیم. این پکیج با استفاده از اجرای دستور زیر در خط فرمان امکان پذیر است.
$ go get "github.com/go-sql-driver/mysql"
پس از اضافه نمودن این پکیج به پروژه در دایرکتوری utils فایلی با نام db.go اضافه میکنیم.
در این فایل username, password, host, port, db_name به ترتیب نام کاربری و رمز عبور و هاست و پورت و نام دیتابیس است.
اضافه کردن یک کاربر جدید در دیتابیس و دریافت JWT Token
پس از ایجاد کانکشن بین دیتابیس و Echo شروع به ساخت مدل و کنترلر خواهیم کرد. مدل ها در دایرکتوری models و کنترلرها در دایرکتوری controllers ایجاد خواهند شد. مدل User را در فایل user.go و در دایرکتوری models ایجاد میکنیم.
پس از ساخت مدل User کنترلر مربوط به اکشنهای این مدل را در قالب فایل userController.go و در دایرکتوری controllers ایجاد میکنیم.
قبل از ایجاد این فایل پکیج های زیر را بصورت زیر نصب میکنیم :
$ go get github.com/dgrijalva/jwt-go
$ go get golang.org/x/crypto/bcrypt
$ go get gopkg.in/go-playground/validator.v9
اولین پکیج جهت ساخت توکن برای کاربر ثبت نام شده , پکیج دوم جهت رمزنگاری رمزعبور وارد شده توسط کاربر و پکیج سوم جهت کنترل مقادیر ورودی توسط کاربر است.
در این مرحله نیاز است تا route مخصوص به ایجاد کاربر جدید را در فایل main.go ایجاد کنیم. فایل main.go جدید بصورت زیر خواد بود.
خط ۲۰ از این فایل نشان می دهد که یک route group برای کاربرها ایجاد شده است. همانطور که در فایل userController.go مشخص است یک ثابت جدید نیز به فایل constants.go اضافه شده است.
فایل translator.go نیز بصورت زیر تغییر خواهد کرد.
پس از اتمام کار با ارسال یک request از نوع POST به /users و ارسال request body بصورت زیر میتوان کاربر را ثبت نام کرده و یک توکن در response برگرداند.
همچنین میتوانید کدهای این آموزش را از آدرس گیت هاب پروژه مشاهده نمایید.
مطلبی دیگر از این انتشارات
یه باگ بد و یک طومار حرف جاواسکریپتی - حکایتی از اسنپ مارکت
مطلبی دیگر از این انتشارات
تجربه ساخت تیم محصول در اسنپ مارکت
مطلبی دیگر از این انتشارات
با Redux دوست باشیم (بخش اول)