GET

Простейший сервер

package main
 
import (
    "fmt"
    "net/http"
)
 
func main() {
        // handle route using handler function
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprintf(w, "Hello go server!")
    })
 
        // listen to port
    http.ListenAndServe(":8080", nil)
}

Давайте выполним get запрос на localhost:8910 c помощью Postman

Screenshot 2024-03-16 at 16.50.55.png

Давайте сделаем порт конфигурируемым. Сначала напишем обработку входного параметра

package main

import (
	"fmt"
	"os"
)

func main() {
	var portNumber string
	if len(os.Args) == 2 {
		portNumber = os.Args[1]
	} else {
		fmt.Println("please provide port number as a `run` argument e.g: `go run main.go 8080`")
		return
	}
	
	fmt.Println(portNumber)
	http.ListenAndServe(":8080", nil)
}

А затем используем его в коде

package main

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

func main() {
	var portNumber string
	if len(os.Args) == 2 {
		portNumber = os.Args[1]
	} else {
		fmt.Println("please provide port number as a `run` argument e.g: `go run main.go 8080`")
		return
	}

	http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
		fmt.Fprintf(w, "Hello go server!")
	})

	// listen to port
	fmt.Printf("Listening port %s\\n", portNumber)
	http.ListenAndServe(fmt.Sprintf(":%s", portNumber), nil)
}

Теперь перейдем к обработке разных путей добавим обработчик get /tasks

package main

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

func main() {
	var portNumber string
	if len(os.Args) == 2 {
		portNumber = os.Args[1]
	} else {
		fmt.Println("please provide port number as a `run` argument e.g: `go run main.go 8080`")
		return
	}

	http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
		fmt.Fprintf(w, "Hello go server!")
	})
	
	// +++++++
	http.HandleFunc("/tasks", func(w http.ResponseWriter, r *http.Request) {
		fmt.Fprintf(w, "Hello from tasks!")
	})
	// +++++++

	// listen to port
	fmt.Printf("Listening port %s\\n", portNumber)
	http.ListenAndServe(fmt.Sprintf(":%s", portNumber), nil)
}

Теперь разнесем обработку запросов с разными путями в отдельные функции с помощью мультиплексора

package main

import (
	"fmt"
	"io"
	"net/http"
	"os"
)

func main() {
	var portNumber string
	if len(os.Args) == 2 {
		portNumber = os.Args[1]
	} else {
		fmt.Println("please provide port number as a `run` argument e.g: `go run main.go 8080`")
		return
	}

	mux := http.NewServeMux()

	mux.HandleFunc("/", handleGetRoot)
	mux.HandleFunc("/home", handleGetRoot)
	mux.HandleFunc("/tasks", handleGetTasks)

	// listen to port
	fmt.Printf("Listening port %s\\n", portNumber)
	http.ListenAndServe(fmt.Sprintf(":%s", portNumber), mux)
}

func handleGetRoot(w http.ResponseWriter, r *http.Request) {
	io.WriteString(w, "Hello Root!")
}

func handleGetTasks(w http.ResponseWriter, r *http.Request) {
	io.WriteString(w, "Hello Tasks!")
}

Обработка get параметров:

Давайте модифицируем функцию отдачи списка задач так чтобы она обрабатывала get параметры

func handleGetTasks(w http.ResponseWriter, r *http.Request) {

	params, err := url.ParseQuery(r.URL.RawQuery)
	if err != nil {
		fmt.Printf("Error while parsing query %s\\n", r.URL.RawQuery)
		fmt.Printf("%s\\n", err.Error())
	}
	fmt.Println(params)

	io.WriteString(w, "Hello Tasks!")
}

Теперь давайте захардкодим список задач

var tasks = map[uint64]string{
	0: "Drink coffee",
	1: "Be awesome",
	2: "Pet the cat",
}