Compojure, Ring responses and index.html


2014-01-24 · 1 min read

In Compojure, if you want to display a static file from resource/public, you can either redirect to that file or serve it as a resource response using functions provided by ring-core library via ring.util.response.

Let’s consider the following application:

(ns example.core
  (:use ring.util.response)
  (:require [compojure.handler :as handler]
            [compojure.route :as route]
            [compojure.core :refer [GET POST defroutes]]))

(defroutes app-routes
  (GET "/" [] ...)
  (route/resources "/")
  (route/not-found "Page not found"))

(def app
  (handler/api app-routes))

In the case of the redirect, you should replace … by the following line

(redirect “index.html”)

With this approach index.html will be part of the URL. If you prefer not to display index.html as a part of the URL while serving it to the user, you should use resource-response function i.e.

(resource-response "index.html" {:root "public"})

This function serves files found on the classpath - it means it will also work for the uberjar which is not true for file-resource function.

It's public as opposed to resources/public, because resources is one of the top-level directories included in the uberjar.