Examples for Advanced Handling by Golang

Get Request Header

package api
import "net/http"
import "fmt"

func HandleRequest(w http.ResponseWriter, r *http.Request, pam map[string]string ) error {

	fmt.Fprint(w, "Here is all req headers:\n")

	//get the req Headers
	for k, v := range r.Header {
		for _, vv := range v {
			fmt.Fprint(w, k+"=" + vv)
			fmt.Fprint(w, "\n")
		}
	}
	return nil
}

Get Request Query Parameter

package api
import "net/http"
import "fmt"

// three different methos to access query parameters
func HandleRequest(w http.ResponseWriter, r *http.Request, pam map[string]string ) error {

    //r.FormValue to access the url query parameters
    fmt.Fprint(w, "fileds=" + r.FormValue("fields") + "\n")

    //r.URL.Query().Get() only get the 1st item of the query param
    fmt.Fprint(w, "fields=" + r.URL.Query().Get("fields") + "\n")

    //r.URL.Query()[] get array of all values of the query param
    paramarray := r.URL.Query()["fields"]

    for _, value := range paramarray {
        fmt.Fprint(w, "fields="+value + "\n")
    }

    return nil
}

Get Path Parameter

package api
import "net/http"
import "fmt"

// the path will be :  /xxxx/:user/:book/
func HandleRequest(w http.ResponseWriter, r *http.Request, pam map[string]string ) error {

    fmt.Fprint(w, pam["user"])
    fmt.Fprint(w, pam["book"])

    return nil
}

Set Response Header

package api
import "net/http"
import "fmt"

func HandleRequest(w http.ResponseWriter, r *http.Request, pam map[string]string ) error {

	// set or add headers
	w.Header().Set("aa", "abcd")
	w.Header().Add("bb", "cdef")

	// use fmt.Fprint to write response body
	fmt.Fprint(w, "Welcome!\n")

	return nil
}

Response Redirect

package api
import "net/http"

func HandleRequest(w http.ResponseWriter, r *http.Request, pam map[string]string ) error {

	http.Redirect(w, r, "http://www.google.com/", 307)

	return nil
}

Response text body

package api
import "net/http"

func HandleRequest(w http.ResponseWriter, r *http.Request, pam map[string]string ) error {

	// use w.Wrtie to write response body 
	w.Write([]byte("hello, this  is a test"))

	return nil
}

Response Json body

package api
import "net/http"
import "encoding/json"

type MyDATA struct {
	Aa    string `json:"aa, omitempty"`
	Bb    int `json:"bb, omitempty"`
	Cc    bool `json:"cc, omitempty"`
}

func HandleRequest(w http.ResponseWriter, r *http.Request, pam map[string]string ) error {
	var err error
	var body []byte

	mydata := MyDATA {
		Aa: "hello world",
		Bb: 100,
		Cc: true,
	}

	if body, err = json.Marshal(mydata); err != nil {
		return err
	}

	// content-type header
	w.Header().Add("Content-Type", "application/json")

	w.Write(body)
	return nil
}

Get/Set State DB

package api
import "net/http"
import "fmt"

type MyCounter struct {
	Count     int      `json:"count"`
}

func HandleRequest(w http.ResponseWriter, r *http.Request, pam map[string]string ) error {

	var counter = &MyCounter{}

	if err := State.Get("counter", &counter); err != nil {
		counter = &MyCounter{Count:1}
	} else {
		counter.Count++
	}

	State.Save("counter", *counter)

	fmt.Fprintf(w, "current counter:%d\n", counter.Count)

	return nil
}