چطور یک وب سرویس ساده با Go بنویسیم

golang.org
golang.org

چرا 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

البته این پروتکل خود جای چند مقاله دارد ولی با این حال چون عنوان مطلب موضوعی دیگر است ناچار به مشاهده این عکس ادامه کار را پی میگیریم

Open Programmer
Open Programmer

با توجه به عکس ما در واقع یک درگاه درست میکنیم که از طریق آن هر وسیله ای که بتواند به شبکه متصل شود بتواند از طریق آن درگاه اطلاعات مختلفی دریافت کند

این اطلاعات میتواند آدرس دنبال کنندگان ویرگول شما و یا میزان رطوبت خاک گلخانه شما باشد!

در واقع ما در طرف سمت راست تصویر اطلاعات مختلف را به هر صورتی از هر جایی جمع آوری میکنیم و سپس بر اساس درخواست های مختلف در قالب هایی آن هارا ارائه می کنیم

برای مثال لطفا به تصویر زیر نگاه کنید

Stack Overflow
Stack Overflow

برای دریافت لیست کل تصاویر که به هر صورتی از هر جایی جمع آوری شده فقط کافی است مثلا به آدرس 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 بسیار ساده تر است

البته این آموزش یک مثال خیلی خیلی ساده از استفاده این زبان بود

امروز کتابخوانه های بسیار قوی تر برای بستر های بزرگتر توسعه داده شده است که میتوان از آن ها استفاده کرد

منابع


کم و کاستی های فروان این مطلب را بر ما ببخشید

لطفا نظرات خود را حتما لطفا اینجا بگذارید