مبانی برنامههای وب
حالا که همه چیز به درستی راهاندازی شده است، بیایید اولین نسخه برنامه وب خود را بسازیم. ما با سه مورد ضروری مطلق شروع میکنیم:
اولین چیزی که نیاز داریم یک handler است. اگر قبلاً برنامههای وب با استفاده از الگوی MVC ساختهاید، میتوانید handlerها را کمی شبیه به controllerها در نظر بگیرید. آنها مسئول اجرای منطق برنامه شما و نوشتن هدرها و بدنه پاسخ HTTP هستند.
مؤلفه دوم یک router (یا servemux در اصطلاحات Go) است. این یک نگاشت بین الگوهای مسیریابی URL برای برنامه شما و handlerهای مربوطه را ذخیره میکند. معمولاً یک servemux برای برنامه خود دارید که شامل تمام مسیرهای شماست.
آخرین چیزی که نیاز داریم یک سرور وب است. یکی از چیزهای عالی درباره Go این است که میتوانید یک سرور وب راهاندازی کنید و برای درخواستهای ورودی گوش دهید به عنوان بخشی از خود برنامه. شما نیازی به یک سرور شخص ثالث خارجی مانند Nginx، Apache یا Caddy ندارید.
بیایید این مؤلفهها را در فایل main.go کنار هم قرار دهیم تا یک برنامه کارآمد بسازیم.
package main import ( "log" "net/http" ) // Define a home handler function which writes a byte slice containing // "Hello from Snippetbox" as the response body. func home(w http.ResponseWriter, r *http.Request) { w.Write([]byte("Hello from Snippetbox")) } func main() { // Use the http.NewServeMux() function to initialize a new servemux, then // register the home function as the handler for the "/" URL pattern. mux := http.NewServeMux() mux.HandleFunc("/", home) // Print a log message to say that the server is starting. log.Print("starting server on :4000") // Use the http.ListenAndServe() function to start a new web server. We pass in // two parameters: the TCP network address to listen on (in this case ":4000") // and the servemux we just created. If http.ListenAndServe() returns an error // we use the log.Fatal() function to log the error message and exit. Note // that any error returned by http.ListenAndServe() is always non-nil. err := http.ListenAndServe(":4000", mux) log.Fatal(err) }
وقتی این کد را اجرا میکنید، یک سرور وب را روی پورت 4000 ماشین محلی شما راهاندازی میکند. هر بار که سرور یک درخواست HTTP جدید دریافت میکند، آن را به servemux ارسال میکند و — به نوبه خود — servemux مسیر URL را بررسی میکند و درخواست را به handler مطابق ارسال میکند.
بیایید این را امتحان کنیم. فایل main.go خود را ذخیره کنید و سپس سعی کنید آن را از ترمینال خود با استفاده از دستور go run اجرا کنید.
$ cd $HOME/code/snippetbox $ go run . 2024/03/18 11:29:23 starting server on :4000
در حالی که سرور در حال اجرا است، یک مرورگر وب باز کنید و سعی کنید از http://localhost:4000 بازدید کنید. اگر همه چیز طبق برنامه پیش رفته باشد، باید صفحهای ببینید که کمی شبیه به این است:
اگر به پنجره ترمینال خود برگردید، میتوانید سرور را با فشردن Ctrl+C روی صفحه کلید خود متوقف کنید.
اطلاعات اضافی
آدرسهای شبکه
آدرس شبکه TCP که به http.ListenAndServe() ارسال میکنید باید به فرمت "host:port" باشد. اگر host را حذف کنید (مانند کاری که ما با ":4000" انجام دادیم) سپس سرور روی همه رابطهای شبکه موجود کامپیوتر شما گوش میدهد. به طور کلی، فقط در صورتی نیاز به مشخص کردن host در آدرس دارید که کامپیوتر شما چندین رابط شبکه داشته باشد و بخواهید فقط روی یکی از آنها گوش دهید.
در پروژهها یا مستندات Go دیگر ممکن است گاهی اوقات آدرسهای شبکه نوشته شده با استفاده از پورتهای نامگذاری شده مانند ":http" یا ":http-alt" به جای یک عدد را ببینید. اگر از یک پورت نامگذاری شده استفاده کنید، تابع http.ListenAndServe() سعی میکند شماره پورت مربوطه را از فایل /etc/services شما هنگام راهاندازی سرور جستجو کند، و در صورت عدم یافتن تطابق، یک خطا برمیگرداند.
استفاده از go run
در طول توسعه، دستور go run یک روش راحت برای امتحان کردن کد شماست. اساساً یک میانبر است که کد شما را کامپایل میکند، یک باینری قابل اجرا در دایرکتوری /tmp شما ایجاد میکند، و سپس این باینری را در یک مرحله اجرا میکند.
این دستور یا یک لیست جدا شده با فاصله از فایلهای .go، یا مسیر به یک بسته خاص (جایی که کاراکتر . دایرکتوری فعلی شما را نشان میدهد)، یا مسیر کامل ماژول را میپذیرد. برای برنامه ما در حال حاضر، سه دستور زیر همگی معادل هستند:
$ go run . $ go run main.go $ go run snippetbox.alexedwards.net