Skip to content

Net/HTTP library

Funkcje handlujące

Aby odpowiadać na zapytania, musimy stworzyć funkcje handlującą i przypisać ją do ścieżki. Używamy http.HandleFunc, która przyjmuje ścieżkę oraz funkcję o specjalnej sygnaturze.

func d(res http.ResponseWriter, req *http.Request) {
    io.WriteString(res, "dog dog dog")
}

http.HandleFunc("/dog", d)
http.ListenAndServe(":8080", nil)

Możemy też użyć funkcji http.Handle, podobnej do http.HandleFunc. Ta funkcja przyjmuje także ścieżkę oraz obiekt typu Handler, który realizuje specjalny interface. Można użyć funkcji http.HandlerFunc, która jako argument przyjmuje funkcję o specjalnej sygnaturze i zwraca obiekt typu Handler.

func c(res http.ResponseWriter, req *http.Request) {
    io.WriteString(res, "cat cat cat")
}

func main() {
    http.Handle("/dog", http.HandlerFunc(d))
    http.ListenAndServe(":8080", nil)
}    

Wysyłanie zapytania

Wysłanie zapytania składa się z części: 1. Utworzenie nowego zapytania:

url := "https://api.example.com/data"
req, err := http.NewRequest("GET", url, nil)
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
2. Utworzenie klienta i wysłanie zapytania:
client := &http.Client{}
resp, err := client.Do(req)
Powyższy sposób jest ogólny. Możemy tak wysłać dowolne zapytanie. Jeśli jednak chcemy ograniczyć się tylko do GET lub POST, możemy to zrobić tak:
func (c *Client) Get(url string) (resp *Response, err error
func (c *Client) Post(url, contentType string, body io.Reader) (resp *Response, err error)

Odbieranie zapytania POST

Odbierając zapytanie mamy dostęp do wskaźnika do struktury *http.Request. Należy wtedy wykonać odpowiednie funkcje:

req.ParseForm() – parsuje dane formularza przesłane daną metodą (POST)
req.PostForm.Get("name")

Uwaga

Zawsze należy wykonać komendę:

defer resp.Body.Close()

ServeMux, method based routing

Można tworzyć drzewa multiplekserów, które będą handlować zapytaniami.

router := http.NewServeMux() 
subrouter := http.NewServeMux() 
subrouter.HandleFunc(...)
Teraz, aby dodać rodzinę adresów dla podroutera dla danego prefiksu wywołujemy na glównym routerze: router.Handle("/api/", http.StripPrefix("/api", subrouter)) Zauwazmy, ze http.ServeMux implementuje interfejs Handler.

Informacja

Od wersji 1.22 możemy definiować funkcje handlujące na danego rodzaju zapytania:

router.HandleFunc("POST /api", ...)