Developing a simple API backend
Genie makes it very easy to quickly set up a REST API backend. All it takes is a few lines of code:
using Genie
import Genie.Router: route
import Genie.Renderer.Json: json
Genie.config.run_as_server = true
route("/") do
(:message => "Hi there!") |> json
end
Genie.startup()
The key bit here is Genie.config.run_as_server = true. This will start the server synchronously so the startup() function won't return.
This endpoint can be run directly from the command line - if say, you save the code in a rest.jl file:
$ julia rest.jl
Accepting JSON payloads
One common requirement when exposing APIs is to accept POST payloads. That is, requests over POST, with a request body, usually as a JSON encoded object. We can build an echo service like this:
using Genie, Genie.Router, Genie.Renderer.Json, Genie.Requests
using HTTP
route("/echo", method = POST) do
message = jsonpayload()
(:echo => (message["message"] * " ") ^ message["repeat"]) |> json
end
route("/send") do
response = HTTP.request("POST", "http://localhost:8000/echo", [("Content-Type", "application/json")], """{"message":"hello", "repeat":3}""")
response.body |> String |> json
end
Genie.startup(async = false)
Here we define two routes, /send and /echo. The send route makes a HTTP request over POST to /echo, sending a JSON payload with two values, message and repeat.
In the /echo route, we grab the JSON payload using the Requests.jsonpayload() function, extract the values from the JSON object, and output the message value repeated for a number of times equal to the repeat value.
If you run the code, the output should be
{
echo: "hello hello hello "
}
If the payload contains invalid JSON, the jsonpayload will be set to nothing. You can still access the raw payload by using the Requests.rawpayload() function.
You can also use rawpayload if for example the type of request/payload is not JSON.