Go یک زبان قدرتمند و انعطاف پذیر برای ساخت اپلیکیشن های تحت وب است. بسته خالص نقش اساسی در اکوسیستم Go دارد.
Go یک زبان قدرتمند و انعطاف پذیر برای ساخت اپلیکیشن های تحت وب است. بسته خالص نقش اساسی در اکوسیستم Go دارد.
مانند بسیاری از زبان های برنامه نویسی سمت سرور، Go با یک بسته HTTP برای تعامل با پروتکل HTTP عرضه می شود. بسته Go مربوطه بسته http است که یک بسته فرعی از بسته net است.
بسته net/http چیست؟
بسته net/http یکی از کتابخانه های استاندارد Go است. مجموعه کاملی از توابع و انواع را برای ساخت کلاینتها، سرورهای HTTP و سایر عملیاتهای مبتنی بر HTTP فراهم میکند. این موارد عبارتند از:
- توابع برای ایجاد درخواست های HTTP.
- رسیدگی به درخواست ها و پاسخ ها
- ارائه درخواست های HTTP
- اشیاء مرتبط مانند هدرها و کوکی ها.
بسته net/http همچنین از رمزگذاری TLS/SSL، HTTP/2 و سایر ویژگیهای پیشرفته پشتیبانی میکند که این بسته را به ابزاری ضروری برای توسعهدهندگان Go تبدیل میکند.
بسیاری از کتابخانه ها و فریم ورک های محبوب Go، از کیت ابزار وب Gorilla گرفته تا چارچوب وب Echo، در بالای بسته net/http ساخته شده اند.
راه اندازی یک سرور HTTP ساده
راه اندازی سرورها یکی از عملیات اساسی است که برای کار با پروتکل HTTP باید بدانید.
در اینجا یک برنامه برای اجرای یک سرور ساده در Go آمده است:
package main
import (
"fmt"
"net/http"
)
// handler is a typical HTTP request-response handler in Go; details later
func handler(w http.ResponseWriter, r *http.Request) {
// Fprintf formats the string to a writer
fmt.Fprintf(w, "Hello, World!")
}
func main() {
http.HandleFunc("/", handler)
http.ListenAndServe(":8080", nil)
}
تابع handler یک کنترل کننده درخواست-پاسخ معمولی برای بسته http است. این تابع رشته “Hello, World!” را می نویسد. به نویسنده پاسخ HTTP.
هنگام اجرای کد و بازدید از http://localhost:8080/ در یک مرورگر وب، باید “Hello, World!” رشته ای که در مرورگر شما نمایش داده می شود.
رسیدگی به درخواست ها و پاسخ ها
شما می توانید درخواست های دریافتی را با روش HandleFunc بسته http رسیدگی کنید. متد HandleFunc یک رشته مسیر و یک تابع handler را می گیرد.
متد http.Request نمونه ای از درخواست ورودی است و شما می توانید از روش های متعدد نمونه خود برای تعامل با درخواست های مسیر استفاده کنید.
http.HandleFunc("/users", func(w http.ResponseWriter, r *http.Request) {
switch r.Method {
case "GET":
// handle GET request
case "POST":
// handle POST request
default:
http.Error(w, "Invalid request method", http.StatusMethodNotAllowed)
}
})
کد بالا از بسته http برای تعریف یک تابع کنترل کننده HTTP برای مسیر /users استفاده می کند. تابع handler به درخواست های HTTP ورودی در مسیر گوش می دهد و آنها را بر اساس روش درخواست پردازش می کند (به عنوان مثال، GET، POST، و غیره)
تابع handler متدهای ResponseWriter و Request را به عنوان آرگومان می گیرد. ResponseWriter یک رابط است که به کنترل کننده کمک می کند تا داده ها را به عنوان پاسخ به مشتری بنویسد، و Request ساختاری است که حاوی اطلاعاتی در مورد درخواست ورودی است، مانند روش HTTP، URL، هدرها و غیره.
تابع کنترل کننده بالا از یک دستور switch برای تعیین روش درخواست و اجرای بلوک های کد مختلف بر اساس روش استفاده می کند. اگر روش GET باشد، کنترل کننده درخواست GET را رسیدگی می کند. در غیر این صورت، روش POST است. درخواست POST را رسیدگی می کند.
اگر روش چیز دیگری باشد، یک http.Error با پیام “Invalid request method” و یک کد وضعیت StatusMethodNotAllowedHTTP برای مشتری ارسال می کند.
می توانید با استفاده از روش Write نمونه نویسنده خود که یک تکه بایت از رشته ها را می گیرد و رشته را می نویسد، رشته ها را به مشتری بازنویسی کنید.
w.Write([]byte("Hello, World!"))
می توانید از متد WriteHeader نمونه ResponseWriter خود برای نوشتن هدرها برای مشتری استفاده کنید.
w.WriteHeader(http.StatusOK)
کار با میان افزار HTTP
میانافزار شامل توابعی است که درخواستهای HTTP ورودی برای عملیات را قبل از اینکه درخواست به تابع کنترلکننده بعدی ادامه دهد، رهگیری میکند.
در اینجا مثالی از ثبت عملکرد کنترل کننده میان افزار در Go آورده شده است:
func loggingMiddleware(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
// log the request
next.ServeHTTP(w, r)
// log the response
})
}
تابع loggingMiddleware یک هندلر HTTP را می گیرد و یک کنترلر HTTP جدید را برمی گرداند. کنترل کننده HTTP بازگشتی یک تابع ناشناس است که یک پاسخ نویس HTTP و یک درخواست HTTP را می گیرد. تابع درخواست را ثبت می کند و متد ServeHTTP را در کنترل کننده HTTP بعدی فراخوانی می کند و به عنوان آرگومان پاسخ نویس و درخواست را ارسال می کند.
شما می توانید توابع میان افزار را با روش Handle بسته http مدیریت کنید. روش Handle مسیر و تابع میان افزار را در بر می گیرد.
http.Handle("/", loggingMiddleware(http.HandlerFunc(handler)))
تغییر مسیر با بسته HTTP
تغییر مسیر یک عملیات محبوب برای برنامه های کاربردی وب است که کاربران را به منابع یا صفحات وب دیگر ارجاع می دهد.
می توانید با استفاده از روش Redirect بسته http به صفحه وب دیگری هدایت شوید.
http.Redirect(w, r, "http://example.com", http.StatusMovedPermanently)
روش Redirect شامل نمونه ResponseWriter و Request، URL صفحه جدید و یک کد وضعیت برای تغییر مسیر می شود.
شما می توانید API های پیچیده را در Go بسازید
بسته http یک ابزار قدرتمند و انعطاف پذیر برای ساخت API های پیچیده است. میتوانید از کتابخانه استاندارد غنی Go و سایر بستههای شخص ثالث قدرتمند برای افزودن عملکرد به APIهای خود، مانند اتصال به پایگاه داده و پشتیبانی از چارچوبهای مختلف وب، استفاده کنید.
با Go، میتوانید APIهای مقیاسپذیر و با کارایی بالا بسازید که ترافیک درخواستی قابل توجه و وظایف پیچیده پردازش داده را به راحتی مدیریت میکنند.