DocsGo

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/websocket

Set 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
			}
		}
	}
}

← OverviewJava →