Rules of Thumb:
package main import ( "encoding/json" "fmt" "net/http" ) func main() { http.HandleFunc("/", func(w http.ResponseWriter,r *http.Request) { w.Header().Set("Content-Type", "application/json") json, _ := json.Marshal(map[string]string{ "Hello": "World", }) fmt.Fprint(w, string(json)) }) http.ListenAndServe(":8080", nil) }
package main import ( "fmt" "log" "net/http" "encoding/json" "html/template" "time" ) func main() { http.HandleFunc("/hello", handleHello) fmt.Println("serving on http://localhost:7777/hello") log.Fatal(http.ListenAndServe("localhost:7777", nil)) } func handleHello(w http.ResponseWriter, req *http.Request) { query := req.FormValue("q") // POST parameter log.Println("serving", req.URL) fmt.Fprintln(w, "Hello, Go!") }
cd ~/go/src mkdir hello nano hello/hello.go
package main import "github.com/codegangsta/martini" func main() { server := martini.Classic() server.Get("/", func() string { return "<h1>Hello, world!</h1>" }) server.Get("/:param", func(args martini.Params) string { return "<h1>Hello " + args["param"] + "</h1>" }) server.Run() }
Edit the default Nginx configuration file:
sudo nano /etc/nginx/sites-enabled/default # edit with the correct IP: server_name your_ip_or_domain;
configure nginx to pass requests to the martini application
location / { proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $remote_addr; proxy_set_header Host $host; proxy_pass http://127.0.0.1:3000; }
reload:
sudo service nginx restart
func main() { client := &http.Client{} uri := "http://api.service.com/" data := url.Values{"foo": {"bar"}} // POST request r, _ := http.NewRequest("POST", uri, bytes.NewBufferString(data.Encode())) attempts, maxAttempts := 0, 5 var ( resp *http.Response err error ) retries := 5 for i := 0; i < retries; i++ { resp, err = client.Do(r) netErr, conversionOK := err.(net.Error) if err == nil || conversionOK && netErr.Temporary() { break } time.Sleep(3) } if err != nil { panic(err) } // do something with resp here }