توسعه REST API با استفاده از GoLang, Echo, MySql, JWT Token با معماری MVC

GoLang REST API using Echo, MySql, JWT Token
GoLang REST API using Echo, MySql, JWT Token

در این آموزش ساخت 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"
main.go file in project root
main.go file in project root

همانطور که مشاهده میشود در این فایل و در بلاک import از پکیج utils که مربوط به همین پروژه است استفاده شده است. این پکیج مربوط به دایرکتوری utils همین پروژه است که شامل سه فایل response.go, translator.go و constants.go است که در ادامه بررسی خواهد شد.

response.go file inside utils directory
response.go file inside utils directory

خطوط ۵ تا ۱۰ فایل 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 در زبانهای مختلف برمیگرداند.

translator.go file inside utils directory
translator.go file inside utils directory

در این فایل ثابتی با نام NotFoundErrorMessageKey قرار دارد. این ثابت نیز در فایل constants.go و در دایرکتوری utils تعریف شده است. این فایل جهت نگهداری ثوابت استفاده میشود که در ادامه ثوابت دیگری نیز به آن اضافه خواهد شد.

constants.go file in utils directory
constants.go file in utils directory

با اجرای کد زیر در خط فرمان REST API بسیار ساده ای بدون هیچ rout تعریف شده ای خواهیم داشت. این سرویس در پاسخ به هر request پیغام not found را ارسال میکند که در خطوط ۱۱ تا ۱۴ فایل main.go تعریف کرده ایم. این API روی آدرس لوکال هاست و پورت دلخواه تعریف شده ۱۳۲۳ اجرا خواهد شد.

$ go run main.go

حال اگر در مرورگر یا نرم افزارهایی مثل PostMan آدرس localhost:1323 را فراخوانی کنیم در پاسخ response زیر را دریافت خواهیم کرد.

not found response for first request
not found response for first request

اتصال GoLang به دیتابیس MySql

جهت اتصال به دیتابیس MySql نیاز است تا ابتدا پکیج درایور آن را به پروژه اضافه کنیم. این پکیج با استفاده از اجرای دستور زیر در خط فرمان امکان پذیر است.

$ go get "github.com/go-sql-driver/mysql"

پس از اضافه نمودن این پکیج به پروژه در دایرکتوری utils فایلی با نام db.go اضافه میکنیم.

db.go file inside utils directory
db.go file inside utils directory

در این فایل username, password, host, port, db_name به ترتیب نام کاربری و رمز عبور و هاست و پورت و نام دیتابیس است.

اضافه کردن یک کاربر جدید در دیتابیس و دریافت JWT Token

پس از ایجاد کانکشن بین دیتابیس و Echo شروع به ساخت مدل و کنترلر خواهیم کرد. مدل ها در دایرکتوری models و کنترلرها در دایرکتوری controllers ایجاد خواهند شد. مدل User را در فایل user.go و در دایرکتوری models ایجاد میکنیم.

user.go file inside models directory
user.go file inside models directory

پس از ساخت مدل 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

اولین پکیج جهت ساخت توکن برای کاربر ثبت نام شده , پکیج دوم جهت رمزنگاری رمزعبور وارد شده توسط کاربر و پکیج سوم جهت کنترل مقادیر ورودی توسط کاربر است.

userController.go file inside controller directory
userController.go file inside controller directory

در این مرحله نیاز است تا route مخصوص به ایجاد کاربر جدید را در فایل main.go ایجاد کنیم. فایل main.go جدید بصورت زیر خواد بود.

modified main.go file in project root
modified main.go file in project root

خط ۲۰ از این فایل نشان می دهد که یک route group برای کاربرها ایجاد شده است. همانطور که در فایل userController.go مشخص است یک ثابت جدید نیز به فایل constants.go اضافه شده است.

modified constants.go file inside utils directory
modified constants.go file inside utils directory

فایل translator.go نیز بصورت زیر تغییر خواهد کرد.

modified translator.go file inside utils directory
modified translator.go file inside utils directory

پس از اتمام کار با ارسال یک request از نوع POST به /users و ارسال request body بصورت زیر میتوان کاربر را ثبت نام کرده و یک توکن در response برگرداند.

request body to register user and get token
request body to register user and get token
response body with token
response body with token

همچنین میتوانید کدهای این آموزش را از آدرس گیت هاب پروژه مشاهده نمایید.