Skip to content
Snippets Groups Projects
Forked from DevOps (Lecture FB VI) / webservice
This fork has diverged from the upstream repository.

Webservice

A Go-based simple web service meant to be the subject of any tutorial or even used the project work.

Prerequisites:

State:

If the database host is not explicitly defined, then the state is ephemeral. For more information checkout the configuration code.

Build:

  1. Install dependencies: go get -t ./...
  2. Run locally: go run .
  3. Execute unit tests: go test -race -v ./...
  4. Build artifact: go build -o ./artifact.bin ./*.go

To build for another platform, set GOOS and GOARCH. To yield a static binary (fully self-contained, no dynamic linking) set CGO_ENABLED=0. To set a version during build time, add the following CLI option -ldflags "-X webservice/configuration.version=${VERSION}". For more information, please refer to the Makefile.

Run:

HOST=0.0.0.0 PORT=8080 ./artifact.bin

Interact:

Landing page

plain text:

curl http://localhost:8080

HTML:

curl --header 'Accept: text/html; charset=utf-8' http://localhost:8080
# or just open in a browser
Health check
curl http://localhost:8080/health
Server side environment variables

List environment variables visible by the webservice process if environment is not production.

curl http://localhost:8080/env
State life cycle

URL slug is used as identifier and the body is the actual data being stored. Please note, when writing (add or change) something, Content-Type must be set in the request header.

Write an entry:

curl \
  -X PUT \
  --header 'Content-Type: text/plain; charset=utf-8' \
  --data 'foo' \
  http://localhost:8080/state/bar

Find out MIME type and size of an entry:

curl \
  -X HEAD \
  http://localhost:8080/state/bar

Obtain an entry:

curl \
  -X GET \
  http://localhost:8080/state/bar

Remove an entry:

curl \
  -X DELETE \
  --verbose \
  http://localhost:8080/state/bar

List all existing entries (returns JSON or plain text, depending on the Accept header):

curl \
  -X GET \
  --header 'Accept: text/plain' \
  http://localhost:8080/states

Upload an entire file:

curl \
  -X PUT \
  --header 'Content-Type: application/pdf' \
  --upload-file ./example.pdf \
  http://localhost:8080/state/pdf-doc

Download a file:

curl \
  -X GET \
  --output ./example-copy.pdf \
  http://localhost:8080/state/pdf-doc