Cách xây dựng một web server cơ bản bằng Go

Go là một ngôn ngữ lập trình thú vị để xây dựng các ứng dụng web hiện đại cũng như phần mềm hệ thống. Nó đã tạo ra tiếng vang lớn sau khi phát hành và cung cấp sức mạnh cho các dịch vụ như Docker, Kubernetes, Terraform, Dropbox và Netflix.

Hơn nữa, bộ sưu tập mạnh mẽ các gói tích hợp sẵn của Go khiến nó trở thành một lựa chọn tuyệt vời để lập trình web. Bài viết này sẽ hướng dẫn cách bạn viết một web server cơ bản trong Go.

Nhập các gói cần thiết

Gói net/HTTP cung cấp mọi thứ cần thiết để tạo web server và client. Gói này trình bày một số chức năng hữu ích để xử lý lập trình web.

Bạn có thể nhập nó bằng cách thêm dòng dưới đây vào đầu mã nguồn của mình:

import "net/http"

Bài viết cũng sẽ sử dụng gói fmt để định dạng chuỗi và gói log để xử lý lỗi. Bạn có thể nhập chúng riêng lẻ như được hiển thị ở trên hoặc nhập tất cả các gói bằng cách sử dụng một câu lệnh import duy nhất:

import (
"fmt"
"log"
"net/http"
)

Bạn có thể tiến hành viết hàm chính sau khi nhập các gói cần thiết. Hãy tiếp tục và lưu file nguồn với phần mở rộng .go. Nếu bạn đang sử dụng Vim, hãy sử dụng lệnh dưới đây để lưu và thoát Vim:

:wq server.go

Viết hàm chính

Các chương trình Go nằm trực tiếp trong hàm chính, được đặt tên khéo léo là “main”. Bạn sẽ cần thực hiện lệnh gọi server tại đây. Thêm các dòng sau vào mã nguồn và xem điều mà chúng sẽ thực hiện:

func main() {
http.HandleFunc("/", index)
log.Fatal(http.ListenAndServe(":8080", nil))
}

Ví dụ đang xác định hàm chính bằng từ khóa func. Go có các quy tắc nghiêm ngặt về vị trí của dấu ngoặc nhọn mở đầu, vì vậy hãy đảm bảo rằng dấu ngoặc nhọn bắt đầu nằm trên dòng chính xác. Câu lệnh đầu tiên trong main định nghĩa rằng tất cả các yêu cầu web đến đường dẫn gốc (“/”) sẽ được xử lý bởi chỉ mục, một hàm của kiểu http.HandlerFunc.

Dòng thứ hai khởi động web server thông qua hàm http.ListenAndServe. Nó báo hiệu server liên tục lắng nghe các yêu cầu HTTP đến trên cổng 8080 của máy chủ. Tham số thứ hai của hàm này là cần thiết để chặn chương trình cho đến khi kết thúc.

http.ListenAndServe luôn trả về lỗi, nên ví dụ sẽ gói lệnh gọi này bên trong lệnh gọi log.Fatal. Câu lệnh này ghi lại bất kỳ thông báo lỗi nào được tạo ở phía máy chủ.

Triển khai chức năng xử lý

Như bạn có thể thấy, hàm chính gọi chỉ mục hàm xử lý để giải quyết các yêu cầu của client. Tuy nhiên, ví dụ vẫn chưa xác định chức năng này cho máy chủ của mình.

Hãy thêm các câu lệnh cần thiết để làm cho hàm index có thể sử dụng được:

func index(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hi there, welcome to %s!", r.URL.Path[1:])
}

Hàm này nhận hai đối số khác nhau của kiểu http.ResponseWriterhttp.Request. Tham số http.ResponseWriter chứa phản hồi của máy chủ đối với yêu cầu đến, có dạng đối tượng http.Request.

Hàm Fprintf từ gói fmt được sử dụng để hiển thị và thao tác các chuỗi văn bản. Bài viết đang sử dụng điều này để hiển thị phản hồi của máy chủ đối với các yêu cầu web. Cuối cùng, thành phần r.URL.Path[1:] được sử dụng để tìm nạp dữ liệu sau đường dẫn root.

  • Cách thiết lập web server cục bộ (Local Web Server) trên Windows, macOS và Linux

Thêm tất cả các phần còn lại

Web server Go của bạn sẽ sẵn sàng sau khi bạn đã thêm tất cả các phần còn lại. Code sẽ trông giống như sau:

import (
"fmt"
"log"
"net/http"
)
func index(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hi there, welcome to %s!", r.URL.Path[1:])
}
func main() {
http.HandleFunc("/", index)
log.Fatal(http.ListenAndServe(":8080", nil))
}

Dòng đầu tiên là cần thiết để biên dịch code web server Go này dưới dạng file thực thi.

Biên dịch code web server Go này dưới dạng file thực thi

Biên dịch code web server Go này dưới dạng file thực thi

QTM-CN

QTM-ĐM