به نام خداوندی که به آدمی آنچه را که نمیدانست تعلیم داد.
چطور یک وب سرویس ساده با Go بنویسیم
چرا Go ؟
زبان Go یک زبان قوی و سریع است که مستندات بسیار قوی و کاملی دارد که نمونه برنامه های زیادی در کاربرد های متنوعی برایش وجود دارد
از مزیت هایی که این زبان میتوان به
- سادگی
زبان از این ساده تریم داریم اصلا!
جدا از این شوخی به نسبت زبان های C و ++C بدون شک این زبان برای پروژه های پیچیده میتواند انتخاب بهتری باشد
منظور از ساده این است که شما کد حرفه ای را با همان قدرتمندی زبان C به صورتی ساده مینوسید در ادامه سادگی آن را خواهیم دید - همروندی
زبان go انتخاب بسیار خوبی برای برنامه نویسی همروند است
با استفاده از goroutine ها میتوان thread های متنوع را به سادگی پیاده و از آن استفاده کرد - ...
از کاربرد های این زبان میتوان در
- وب
- برنامه نویسی سیستمی
- شبکه
- ...
البته go برای برنامه های برنامه های Desktop , GUI-based زیاد مناسب نیست
نصب Go
- لینوکس و مک
برای نصب در لینوکس و مک این اسکریپت را اجرا کنید - ویندوز
به وبسایت golang.org بروید و پکیج مربوط به ویندوز را دانلود و نصب کنید و سپس
Environment Variable تعریف کنید و ...
این لیست آموزشی بسیار خوب است که اتفاقا آموزش نصب برای ویندوز را هم دارد
اگر در هر مرحله ای از دانلود به تحریم لعنتی خوردید شکن میتواند کار راه انداز باشد
معماری نرم افزار
مثل همیشه RESTful!
بیشتر وبسرویس ها از معماری REST استفاده میکنند چون یک استاندارد برای معماری وب و پروتکل Http است
پروتکل REST این ویژگی هارا دارد
- Layered System
- Code On Demand
- Cacheable
- Uniform Interface
- Stateless
- Client-Server
البته این پروتکل خود جای چند مقاله دارد ولی با این حال چون عنوان مطلب موضوعی دیگر است ناچار به مشاهده این عکس ادامه کار را پی میگیریم
با توجه به عکس ما در واقع یک درگاه درست میکنیم که از طریق آن هر وسیله ای که بتواند به شبکه متصل شود بتواند از طریق آن درگاه اطلاعات مختلفی دریافت کند
این اطلاعات میتواند آدرس دنبال کنندگان ویرگول شما و یا میزان رطوبت خاک گلخانه شما باشد!
در واقع ما در طرف سمت راست تصویر اطلاعات مختلف را به هر صورتی از هر جایی جمع آوری میکنیم و سپس بر اساس درخواست های مختلف در قالب هایی آن هارا ارائه می کنیم
برای مثال لطفا به تصویر زیر نگاه کنید
برای دریافت لیست کل تصاویر که به هر صورتی از هر جایی جمع آوری شده فقط کافی است مثلا به آدرس 192.168.1.54 و مسیر photos/ برویم
لازم به ذکر است در این درخواست های فقط محدود به گرفتن یا به اصطلاح GET نمیشود
درخواست هایی دیگر مانند
- فرستادن(POST)
- حذف(DELETE)
- بروزرسانی(UPDATE)
- ...
وجود دارد
خب دیگه واقعا بریم سر اصل مطلب
پیاده سازی
ابتدا یک فولدر ایجاد میکنیم
mkdir -p $GOPATH/src/github/{your username}/rest-api
سپس وارد آن میشویم
cd rest-api
مسیر یاب(Router)
ما از کتابخوانه mux برای اینکار استفاده میکنیم
ابتدا کتابخوانه را دریافت میکنیم
go get github.com/gorilla/mux
یک فایل به نام main.go ایجاد و کد زیر را مینوسیم
package main
import (
"encoding/json"
"log"
"net/http"
"github.com/gorilla/mux"
)
// our main function
func main() {
router := mux.NewRouter()
log.Fatal(http.ListenAndServe(":8000", router))
}
حالا لازم است مسیر هایی که میخواهیم را در main تعریف کنیم
به این صورت
// fun main()
func main() {
router := mux.NewRouter()
router.HandleFunc("/people", GetPeople).Methods("GET")
router.HandleFunc("/people/{id}", GetPerson).Methods("GET")
router.HandleFunc("/people/{id}", CreatePerson).Methods("POST")
router.HandleFunc("/people/{id}", DeletePerson).Methods("DELETE")
log.Fatal(http.ListenAndServe(":8000", router))
}
حالا برنامه را اجرا میکنیم
go build
./rest-api
اگر خطا گرفتید پس تا اینجا درست رفته اید
حالا باید برای هر یک از مسیر هایی که داخل main تعریف کرده ایم یک تابع می نویسیم
func GetPeople(w http.ResponseWriter, r *http.Request) {}
func GetPerson(w http.ResponseWriter, r *http.Request) {}
func CreatePerson(w http.ResponseWriter, r *http.Request) {}
func DeletePerson(w http.ResponseWriter, r *http.Request) {}
حال ساختار های زیر را در main.go بعد از بخش فراخوانی کتابخوانه ها تعریف میکنیم
type Person struct {
ID string `json:"id,omitempty"`
Firstname string `json:"firstname,omitempty"`
Lastname string `json:"lastname,omitempty"`
Address *Address `json:"address,omitempty"`
}
type Address struct {
City string `json:"city,omitempty"`
State string `json:"state,omitempty"`
}
var people []Person
خب تبریک میگم شما ساختار هارا تعریف کردید!
حالا یک سری داده پیش فرض در ساختار هایی که تعریف کرده ایم وارد میکنیم
در فایل main.go کد های زیر را بنویسید
func GetPeople(w http.ResponseWriter, r *http.Request) {
json.NewEncoder(w).Encode(people)
}
یکبار دیگر build و اجرا کنید
go build && ./rest-api
حالا لطفا به آدرس http://localhost:8080 بروید
خب بسیار عالی شما باید لیست همه افرادی را که وارد کرده اید دریافت کنید
گرفتن اطلاعات یک فرد
در فایل main.go کد های زیر را بنویسید
func GetPerson(w http.ResponseWriter, r *http.Request) {
params := mux.Vars(r)
for _, item := range people {
if item.ID == params["id"]
}
}
ایجاد فرد جدید
در فایل main.go کد های زیر را بنویسید
func CreatePerson(w http.ResponseWriter, r *http.Request) {
params := mux.Vars(r)
var person Person
_ = json.NewDecoder(r.Body).Decode(&person)
person.ID = params["id"]
people = append(people, person)
json.NewEncoder(w).Encode(people)
}
حذف یک فرد
در فایل main.go کد های زیر را بنویسید
func DeletePerson(w http.ResponseWriter, r *http.Request) {
params := mux.Vars(r)
for index, item := range people {
if item.ID == params["id"] {
people = append(people[:index], people[index+1]...)
break
}
json.NewEncoder(w).Encode(people)
}
}
اگر هم مشکلی جایی وجود دارد که دلیلش را نمی دانید مخرن این پروژه در گیت هاب است
برای تست route هایی که میتوانید از Postman استفاده کنید
همچنین برای نمایش بهتر خروجی ها از این افزونه داخل کروم هم میتوانید استفاده کنید
لازم به ذکر است همانطور که اول مطلب گفته شد زبان Go نسبت به c++,c بسیار ساده تر است
البته این آموزش یک مثال خیلی خیلی ساده از استفاده این زبان بود
امروز کتابخوانه های بسیار قوی تر برای بستر های بزرگتر توسعه داده شده است که میتوان از آن ها استفاده کرد
منابع
کم و کاستی های فروان این مطلب را بر ما ببخشید
لطفا نظرات خود را حتما لطفا اینجا بگذارید
مطلبی دیگر از این انتشارات
کتابخانه های استاندارد در Go (بخش دوم)
مطلبی دیگر از این انتشارات
Go Developer Roadmap part 2
مطلبی دیگر از این انتشارات
جنریک ها در گو و بررسی پرفورمنس آنها با گرفتن بنچ مارک