Go API
goAPI

The Web client

This site is example of a simple web client. Or web site. Check out Topics and Users to see the fetched result from Postgresql. The Go code to manage this simple web client and fetching data from the Postgresql server is below. Note that this code replaces Apache/Nginx, Node.js and PHP just in a few magic lines. The enging of this site is just under 10 MB of compiled code (+ common html templates, CSS, Javascript, images etc)

package main

import (
  "encoding/json"
  "html/template"
  "log"
  "net/http"
  "strings"
)

var tpl *template.Template

func init() {
  tpl = template.Must(template.ParseGlob("public/tmpl/*.html"))
  http.Handle("/css/", http.StripPrefix("/css/", http.FileServer(http.Dir("./public/css"))))
  http.Handle("/icn/", http.StripPrefix("/icn/", http.FileServer(http.Dir("./public/icn"))))
  http.Handle("/js/", http.StripPrefix("/js/", http.FileServer(http.Dir("./public/js"))))
}

// Go web server (replaces Apache/Nginx) and a endpoint server.
func main() {
  http.HandleFunc("/", endpoint)
  log.Fatal(http.ListenAndServe(":6060", nil))
}

// Dynamic endpoints based on url paths
func endpoint(w http.ResponseWriter, r *http.Request) {
  path := strings.Trim(r.URL.Path, "/")
  page := (path + ".html")
  url := ("http://94.237.92.101:6061/" + path)
  //url := ("http://127.0.0.1:6061/" + path)
  switch path {
  case "favicon.ico", "robots.txt":
    return
  case "": // no endpoint
    page = "home.html"
    fallthrough
  default:
    //if template not found -> redirect.go
    exist := tpl.Lookup(page)
    if exist == nil {
      logg("not found")
      redirect(w, r)
      return
    }
    // get data and fill template
    data := json2map(url)
    tpl.ExecuteTemplate(w, page, data)
  }
}

func json2map(url string) interface{} {
  // call the API and get body
  resp, err := http.Get(url)
  if err != nil {
    logg(err.Error())
  }
  defer resp.Body.Close()

  // json to map
  var result interface{}
  err = json.NewDecoder(resp.Body).Decode(&result)
  if err != nil {
    logg(err.Error())
  }

  return (result)
}