Простейший сервер
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
Давайте сделаем порт конфигурируемым. Сначала напишем обработку входного параметра
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",
}