Webservice
A Go-based simple web service meant to be the subject of any tutorial or even used the project work.
Prerequisites:
- minimal required version of the Go toolchain (install via system package manager or by hand)
- [optional] Redis to persist state
State:
If the database host is not explicitly defined, then the state is ephemeral. For more information checkout the configuration code.
Build:
- Install dependencies:
go get -t ./...
- Run locally:
go run .
- Execute unit tests:
go test -race -v ./...
- 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