1. Server cơ bản(default) cùng ListenAndServe()
  2. Định tuyến các yêu cầu với type ServeMux
  3. Custom server với type server

Tạo 1 server cơ bản với go

Để xử lý các yêu cầu HTTP, Go cung cấp đúng 1 hàm thuộc gói net/http để xử lý đó là ListenAndServe(addr string, handler Handler).
Tham số đầu tiên là địa chỉ có dạng “host:port”, thứ 2 là kiểu interface http.Handler.

package main
import (
	"fmt"
	"net/http"
)
func main() {
http.HandleFunc("/",func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello, well come to chuyenmucit.code.blog")
	})
	http.ListenAndServe(":8080",nil)
}

Chúng ta đã có 1web server với handler “/” và cổng 8080

Định tuyến các yêu cầu với type ServeMux

Như ở blog laptrinhgo.blogspot.comhttps://golang.org/pkg/net/http/ đề cập:
ServeMux: là bộ định tuyến các yêu cầu. Nó so sánh các yêu cầu gửi đến với danh sách tài nguyên đã khai báo trước đó để gọi đúng handler tương ứng để xử lý yêu cầu và phản hồi về cho client. ServeMux bản chất cũng thỏa mãn interface http.Handler vì nó sẽ được truyền làm tham số thứ 2 của http.ListenAndServe.
– Handler là các thực thể thỏa mãn http.Handler chuyên xử lý yêu cầu cụ thể từ client và tạo ra phản hồi gửi về client. Các handler này sẽ được đăng ký với ServeMux để xác định nó chuyên xử lý yêu cầu nào.


Đầu tiên tôi khai báo con trỏ mux nhưng không gán địa chỉ nào cho nó nên
kết quả sẽ là : mux = <nil>
Sau đó tôi khởi tạo đối tượng ServeMux mới và gán vào biến mux như sau:

package main

import (
	"fmt"
	"net/http"
)

func myHandler(w http.ResponseWriter, r *http.Request)  {
	fmt.Fprintf(w,"home")
}

func HelloHandler(w http.ResponseWriter, r *http.Request)  {
	fmt.Fprintf(w,"Hello")
}

func main() {

	var mux  *http.ServeMux
        //NewServeMux sẽ trả về ServeMux mới
	mux = http.NewServeMux()
        // lúc này mux chứa các phương thức liên quan Handle
	mux.HandleFunc("/",myHandler)
	mux.HandleFunc("/hello",HelloHandler)
	http.ListenAndServe(":8080",mux)
}

xử lý các handler thì mình vẫn chỉ để show text đơn giản thư trước. Chỉ có ở hàm http.ListenAndServe() thì mình đã add handler đã khởi tạo là mux.
call get tới localhost:8080/ và localhost:8080/hello nào
ok done serveMux mặc dù các bạn thấy, khi call tới các handle khác như 8080/login cũng cho ra kết quả “home” như nhau :)).

note: Như ở phần code 1, chúng ta không dùng tới serveMux thì http.ListenAndServe() sẽ trỏ tới DefaultServeMux. Nguồn tại:
https://golang.org/pkg/net/http/
ở phần Overview

Custom server với type Server

Trước tiên chúng ta tìm hiểu cấu trúc http.Server theo blog laptrinhgo.blogspot.comhttps://golang.org/pkg/net/http/#Server
thì:

type Server struct {
    Addr string     // <Địa chỉ IP/tên miền>:<cổng>
    Handler Handler          // Đối tượng xử lý yêu cầu
    ReadTimeout time.Duration  // Thời gian tối đa đọc yêu cầu
    WriteTimeout time.Duration // Thời gian tối đa ghi phản hồi
    MaxHeaderBytes int // Chiều dàu phần đầu tính theo byte, kể cả 
                       //dòng yêu cầu
    TLSConfig *tls.Config         // Cấu hình TLS, tùy chọn
    TLSNextProto map[string]func(*Server, *tls.Conn, Handler)
    ConnState func(net.Conn, ConnState)
    ErrorLog *log.Logger
}

Mình sẽ custom server như sau:

package main

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

func myHandler(w http.ResponseWriter, r *http.Request)  {
	fmt.Fprintf(w,"home of chuyenmucit.code.blog")
}

func HelloHandler(w http.ResponseWriter, r *http.Request)  {
	fmt.Fprintf(w,"Hello, chuyenmucit.code.blog ")
}

func main() {

	var mux  *http.ServeMux
	mux = http.NewServeMux()
	mux.HandleFunc("/",myHandler)
	mux.HandleFunc("/hello",HelloHandler)
	s := &http.Server{
		Addr:           ":8080",
		Handler: mux,
		ReadTimeout:    10 * time.Second,
		WriteTimeout:   10 * time.Second,
		MaxHeaderBytes: 1 << 20,
	}
	log.Fatal(s.ListenAndServe())
}

Run server lên thì kết quả cũng tương tự như đoạn code trước, tuy nhiên các thông số server đã được thay đổi ứng với nội dung:
Addr: ":8080",
Handler: mux,
ReadTimeout: 10 * time.Second,
WriteTimeout: 10 * time.Second,
MaxHeaderBytes: 1 << 20,

Như vậy thật dễ để tạo và custom 1 web server cơ bản trong golang mà không dùng framework phải không.
Happly coding ❤
Nguồn tham khảo :