Server Integration — Go
Go's standard net/http with github.com/pickpoint/go-sdk — exposes PickPoint to your frontend. The API key lives in an environment variable and never reaches the client.
1
Initialize module
go mod init yourapp
go get github.com/pickpoint/go-sdk github.com/gorilla/websocketSet PICKPOINT_KEY in your shell environment or in a .env file loaded at startup.
2
Routes: geocoding, routing, devices
// main.go
package main
import (
"context"
"encoding/json"
"log"
"net/http"
"os"
"github.com/pickpoint/go-sdk/pickpoint"
)
var pp *pickpoint.Client
func main() {
var err error
pp, err = pickpoint.New(pickpoint.Config{APIKey: os.Getenv("PICKPOINT_KEY")})
if err != nil {
log.Fatal(err)
}
mux := http.NewServeMux()
// ── Geocoding ──────────────────────────────────────────────────────────
mux.HandleFunc("GET /geo/forward", func(w http.ResponseWriter, r *http.Request) {
writeJSON(w, pp.Forward(r.Context(), query(r)))
})
mux.HandleFunc("GET /geo/reverse", func(w http.ResponseWriter, r *http.Request) {
writeJSON(w, pp.Reverse(r.Context(), query(r)))
})
mux.HandleFunc("GET /geo/search", func(w http.ResponseWriter, r *http.Request) {
writeJSON(w, pp.Search(r.Context(), query(r)))
})
// ── Routing ────────────────────────────────────────────────────────────
mux.HandleFunc("POST /route", func(w http.ResponseWriter, r *http.Request) {
var body map[string]any
if err := json.NewDecoder(r.Body).Decode(&body); err != nil {
http.Error(w, err.Error(), 400)
return
}
writeJSON(w, pp.Route(r.Context(), body))
})
mux.HandleFunc("POST /route/optimized", func(w http.ResponseWriter, r *http.Request) {
var body map[string]any
if err := json.NewDecoder(r.Body).Decode(&body); err != nil {
http.Error(w, err.Error(), 400)
return
}
writeJSON(w, pp.OptimizedRoute(r.Context(), body))
})
// ── Device tracking - REST ─────────────────────────────────────────────
mux.HandleFunc("GET /devices", func(w http.ResponseWriter, r *http.Request) {
writeJSON(w, pp.Devices.List(r.Context(), pickpoint.DeviceListQuery{}))
})
// ── WebSocket relay ────────────────────────────────────────────────────
mux.HandleFunc("GET /tracking-relay", trackingRelay)
log.Println("Listening on :3000")
log.Fatal(http.ListenAndServe(":3000", mux))
}
func query(r *http.Request) pickpoint.Query {
q := pickpoint.Query{}
for k, v := range r.URL.Query() {
if len(v) > 0 {
q[k] = v[0]
}
}
return q
}
func writeJSON(w http.ResponseWriter, v any, err error) {
if err != nil {
http.Error(w, err.Error(), 502)
return
}
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(v)
}3
WebSocket subscriber relay
// ── WebSocket subscriber relay ─────────────────────────────────────────────
import (
"context"
"encoding/json"
"log"
"net/http"
"github.com/gorilla/websocket"
"github.com/pickpoint/go-sdk/tracking"
)
var upgrader = websocket.Upgrader{CheckOrigin: func(r *http.Request) bool { return true }}
func trackingRelay(w http.ResponseWriter, r *http.Request) {
deviceUID := r.URL.Query().Get("deviceUid")
if deviceUID == "" {
http.Error(w, "deviceUid required", 400)
return
}
clientConn, err := upgrader.Upgrade(w, r, nil)
if err != nil {
return
}
defer clientConn.Close()
ctx := r.Context()
pair, err := pickpoint.MintClientTokens(ctx, pickpoint.Config{
APIKey: os.Getenv("PICKPOINT_KEY"),
}, []string{"devices"}, 600)
if err != nil {
log.Println(err)
return
}
session, err := tracking.Connect(ctx, tracking.Config{
Endpoint: "wss://tracking.pickpoint.io",
Listener: &tracking.ListenerAuth{AccessToken: pair.AccessToken},
Subscribe: []string{deviceUID},
})
if err != nil {
log.Println(err)
return
}
defer session.Close()
for {
msg, err := session.Recv(ctx)
if err != nil {
break
}
if loc := msg.Loc; loc != nil {
b, _ := json.Marshal(loc.Point)
if err := clientConn.WriteMessage(websocket.TextMessage, b); err != nil {
break
}
}
}
}