Skip to content

Julia Web Framework Guide — Genie, Oxygen, and Building Web APIs

DodaTech Updated 2026-06-28 2 min read

In this tutorial, you will learn about Julia Web Framework Guide. We cover key concepts, practical examples, and best practices to help you master this topic.

Julia web development frameworks include Genie (MVC with ORM, templates, auth) and Oxygen (lightweight micro-framework for APIs) -- supporting RESTful routing, JSON request/response, CORS configuration, and database connectivity via SearchLight.

Genie MVC

using Genie, Genie.Router, Genie.Requests, Genie.Responses

# Define API routes
route("/api/v1/users", method=GET) do
    users = [
        Dict("id" => 1, "name" => "Alice"),
        Dict("id" => 2, "name" => "Bob")
    ]
    json(users)
end

route("/api/v1/users/:id", method=GET) do
    user = Dict("id" => parse(Int, @params(:id)))
    json(user)
end

# Start server
Genie.startup(port=8000, async=false)

Oxygen Micro-Framework

using Oxygen

# Define endpoints
@get "/" function()
    return "Hello, World!"
end

@get "/greet/:name" function(name::String)
    return Dict("message" => "Hello, $name!")
end

@post "/data" function(req::HTTP.Request)
    body = JSON.parse(String(req.body))
    return Dict("received" => body)
end

# Start server
serve(port=8080)

Middleware and Auth

using Genie, Genie.Requests
using SHA

# Authentication middleware
function authenticate!(handler)
    return function(req)
        auth_header = get(req.headers, "Authorization", "")
        if auth_header != "Bearer valid-token"
            return respond(401, "Unauthorized")
        end
        handler(req)
    end
end

# Apply middleware
route("/api/protected", protected=true) do
    json(Dict("secret" => "data"))
end

Database Integration

using SearchLight, SearchLight.Query

# Define model
@table users begin
    field{name::String}
    field{email::String}
    field{age::Int}
end

# Query
users = find(User, name = "Alice")
user  = findone(User, id = 1)

# Create
User(name="Bob", email="bob@test.com", age=25) |> save!

# Update
user = findone(User, id = 1)
user.name = "Alice Smith"
save!(user)

Common Mistakes

1. Not setting CORS for API clients

Always configure CORS if serving web clients: Genie.config.cors_allowed_origins = ["*"].

2. Blocking the server with long operations

Use @async or background tasks for long-running operations. Don't keep the request handler blocked.

3. Not validating input types

Always validate and parse inputs: parse(Int, @params(:id)) to avoid type errors.

Practice Questions

1. How do you define a GET endpoint in Genie? route("/path", method=GET) do ... end. Return a string or use json().

2. How do you define a POST endpoint in Oxygen? @post "/path" function(req::HTTP.Request) ... end. Access body with String(req.body).

3. How do you handle URL parameters? @params(:name) in Genie or function arguments in Oxygen: @get "/:name" function(name) ... end.

FAQ

{{< faq question="What is the difference between Genie and Oxygen?" >}} Genie is full-stack (MVC, ORM, auth, templates). Oxygen is a minimal micro-framework for APIs. {{< /faq >}}

{{< faq question="Can I serve static files?" >}} Genie serves from public/ directory. Oxygen can serve with HTTP.StaticHandler. {{< /faq >}}

{{< faq question="How do I deploy Julia web apps?" >}} Compile to a system image with PackageCompiler.jl for fast startup. Deploy behind nginx or use Docker. {{< /faq >}}

What's Next

Now learn about optimization in Julia.

Topic Description Link
Optimization Numerical optimization {{< ref "25-optimization" >}}
Time Series Time series analysis {{< ref "26-time-series" >}}

Built by the developers of DodaTech

Doda Browser, DodaZIP & Durga Antivirus Pro