标签: compojure

如何让Compojure听一个IP

我已经启动了一个Compojure(Jetty)服务器:

(defonce *server* (run-server {:host "localhost" :port 8080} "/*" (servlet routes)))
Run Code Online (Sandbox Code Playgroud)

但是netstat仍然显示它正在监听0.0.0.0:8080,即所有IP.

传递给run-server以使其在单个IP上侦听的正确参数是什么?

clojure compojure

6
推荐指数
1
解决办法
612
查看次数

使用带有Compojure的javax.servlet.Filter

我正在尝试使用Clojure/Compojure构建一个简单的Web站点,并希望将servlet过滤器应用于请求/响应(即标准的javax.servlet.Filter实例).

例如,如果当前的源代码是:

(defroutes my-app
  (GET "/*"
    (html [:h1 "Hello Foo!!"]))
)
Run Code Online (Sandbox Code Playgroud)

我想添加一个这样的过滤器:

(defroutes my-app
  (GET "/*"
    (FILTER my-filter-name
      (html [:h1 "Hello Foo!!"])))
)
Run Code Online (Sandbox Code Playgroud)

其中my-filter-name是javax.servlet.Filter的任意实例.

知道如何有效和优雅地做到这一点?

openid servlets clojure compojure servlet-filters

6
推荐指数
1
解决办法
1540
查看次数

如何使用 Compojure 生成修改后的 http 标头?

我正在尝试提高客户端从我的 Compojure 网络服务器获取页面的性能。我们使用 提供了一堆静态文件(JS、CSS)(compojure.route/resources "/"),它在文件系统上查找文件,将它们转换为 URL,然后将它们作为流提供给 Ring。通过转换为流,它似乎丢失了所有文件元数据,例如 mod 时间。

我可以包装静态资源处理程序并添加一个ExpiresorCache-Control: max-age标头,但这会阻止客户端发送任何请求。很有用,但这些文件有时会更改(当我们发布版本时)。

理想情况下,我希望客户端信任其自己的缓存版本,例如一个小时,并If-Modified-Since在该小时过去后使用标头发出请求。然后我们可以返回304 Not Modified,客户端避免下载几百公斤的 javascript。

看起来我可以Last-Modified在提供响应时设置标头,这会导致客户端使用If-Modified-Since标头限定后续请求。很好,除了我必须重写大部分代码compojure.route/resources才能添加Last-Modified- 不难,但很乏味 - 并发明更多代码来识别和响应If-Modified-Since标头。不是一项艰巨的任务,但也不是一项简单的任务。

这是否已经存在于某处?我找不到它,但它似乎是一项足够常见且足够大的任务,以至于现在有人会为它编写一个库。

http clojure compojure http-headers

6
推荐指数
1
解决办法
1434
查看次数

CSS在Compojure/Hiccup中的扩展路径失败

我一直在将一些Noir网站转换为Compojure.

我在这里有一个函数来创建页面的布局:

(defn layout [title & content]
  (html5
   [:head
    [:title "My Site | " title]
    (include-css "css/main.css")
   [:body
    [:header 
     [:h1 (link-to "/" "My Site")]]
    content]))
Run Code Online (Sandbox Code Playgroud)

这是功能和路线:

(defn home-page []
  (layout
   "Home"
   [:div [:p "Home Page"]])))

(defn article-list []
  (layout
   "Article List"
   [:div [:p "Article List"]])))

(defroutes app-routes
  (GET "/" [] (home-page))
  (GET "/article-list" [] (article-list))
Run Code Online (Sandbox Code Playgroud)

当我打开localhost:3000/article-list时,所有CSS规则都可以正常工作.

但是,当我尝试扩展URL路径并将程序更改为:

(defn article-list []
  (layout
   "Article List"
   [:div [:p "Article List"]])))

(defn article-one []
  (layout
   "Article One"
   [:div [:p "Article One"]])))

(defroutes app-routes
  (GET …
Run Code Online (Sandbox Code Playgroud)

clojure compojure hiccup

6
推荐指数
1
解决办法
198
查看次数

为什么ring的资源响应会响应application/octet-stream内容类型?

我想弄清楚Ring为什么resource-response选择回复application/octet-stream内容类型.我最近更新了一些我一直在学习的示例代码,以便它使用更新的代码ring-defaults.在使用之前ring-defaults,此代码使用html内容类型进行响应.为什么现在选择八位字节流?

(ns replays.handler
  (:require [compojure.core :refer [GET defroutes]]
            [compojure.route :as route]
            [ring.util.response :refer [response resource-response]]
            [ring.middleware.json :as middleware]
            [ring.middleware.defaults :refer [wrap-defaults api-defaults]]))

(defroutes app-routes
  (GET  "/" [] (resource-response "index.html" {:root "public"}))
  (GET  "/widgets" [] (response [{:name "Widget 1"} {:name "Widget 2"}]))
  (route/resources "/public")
  (route/not-found "not found"))

(def app
  (-> app-routes
      (middleware/wrap-json-body)
      (middleware/wrap-json-response)
      (wrap-defaults api-defaults)))
Run Code Online (Sandbox Code Playgroud)

而且,对于版本号,这是项目文件......

(defproject replays "0.1.0-SNAPSHOT"

  :url "http://example.com/FIXME"
  :description "FIXME: write description"

  :plugins [[lein-pdo "0.1.1"]
            [lein-ring "0.9.3"]
            [lein-cljsbuild …
Run Code Online (Sandbox Code Playgroud)

clojure compojure ring

6
推荐指数
1
解决办法
1978
查看次数

如何在 Compojure 中使用 CORS 和 JSON 响应?

我正在创建一个简单的 API,它将JSON数据返回给用户。出于开发目的,我想启用 CORS,以便我的react前端可以在本地调用 API。目前,它抱怨

对预检请求的响应未通过访问控制检查:请求的资源上不存在“Access-Control-Allow-Origin”标头。因此,不允许访问Origin ' http://localhost:3001 '。

问题:如何使用ring-cors(或类似的东西)来启用 CORS 并发回 JSON 数据?

观察:对于当前(app ..)(wrap-cors ...)没有提供交叉原点标题。

我已经尝试了几种不同的顺序,但似乎都不起作用。例如,(wrap cors ...)跟随(wrap-defaults ...)不起作用。

移动电源

(ns qitab-api.handler
  (:require [compojure.core :refer :all]
            [compojure.route :as route]
            [ring.middleware.defaults :refer [wrap-defaults site-defaults]]
            [ring.middleware.json :refer [wrap-json-response wrap-json-body]]
            [ring.middleware.cors :refer [wrap-cors]]
            [ring.util.response :as r]))

(defroutes app-routes
   (GET "/" []
     (r/response {:hello "World!!"}))
   (route/not-found "Not Found"))

(def app
  (-> app-routes
      wrap-json-body
      wrap-json-response
     (wrap-defaults site-defaults)
     (wrap-cors …
Run Code Online (Sandbox Code Playgroud)

clojure compojure ring cors

6
推荐指数
1
解决办法
1682
查看次数

Compojure HTML格式

我是Clojure的新手,也是一个完整的HTML/Compojure处女.我正在尝试使用Compojure创建HTML的静态页面,使用类似于此的函数:

(defn fake-write-html
  [dir args]
  (let [file (str dir *file-separator* *index-file*)
        my-html (html
                  (doctype :html4)
                  [:html
                   [:head
                    [:title "Docs and Dirs:"]]
                   [:body
                    [:div
                     [:h2 "A nice title"]]
                    [:div
                     [:ul
                      [:li "One"]
                      [:li "Two"]]]]])]
    (clojure.contrib.duck-streams/spit file my-html)))
Run Code Online (Sandbox Code Playgroud)

该函数只是将HTML写入文件.(这里的args论点无关紧要.只是为了确保示例在我的程序中编译并运行.)

"Programming Clojure"表示对html函数的调用会生成格式化的HTML - 带缩进的多行.我得到的只是预期的doc类型,然后是一行中的所有HTML.HTML Tidy没有发现输出文件内容的任何问题.如果我println在REPL上它也会出现一条线.

是否需要其他东西才能获得格式化输出?

html clojure compojure clojure-contrib

5
推荐指数
2
解决办法
3039
查看次数

Compojure:可选的URL参数

我想在Compojure中定义一个资源,如下所示:

(ANY "myres/:id" [id] (handler))
Run Code Online (Sandbox Code Playgroud)

我希望:id是可选的(取决于是否指定了ID,我的API将表现不同).

如果我尝试访问,这可以正常工作

http://mydomain/myres/12
Run Code Online (Sandbox Code Playgroud)

但是,如果我尝试访问

http://mydomain/myres
Run Code Online (Sandbox Code Playgroud)

没有指定ID,我得到404.

有没有办法让参数:id是可选的?

谢谢!

clojure compojure

5
推荐指数
1
解决办法
1173
查看次数

如何在ring/compojure中启用https和http-> https重定向

我正在开发一个RESTful应用程序,我需要将来自http地址的请求重定向到它的https等效项.我似乎无法使用ring/compojure启用https.

任何人都有一些有用的教程和/或链接?我还没找到.

文档也没有任何用处.

https clojure compojure ring

5
推荐指数
1
解决办法
1050
查看次数

java.lang.IllegalArgumentException:没有方法的实现:: protocol-matches of protocol:#'clout.core/Route

我有两个感兴趣的文件: build.boot

(set-env!
 :source-paths #{"src/clj" "src/cljs" "test/clj"}
 :resource-paths #{"html" "target/main.js"}
 :dependencies '[[adzerk/boot-cljs      "0.0-3308-0"]
                 [adzerk/boot-cljs-repl "0.1.10-SNAPSHOT"]
                 [adzerk/boot-reload    "0.3.1"]
                 [adzerk/boot-test "1.0.4"]
                 [cljsjs/hammer "2.0.4-4"]
                 [compojure "1.3.1"]
                 [com.datomic/datomic-pro "0.9.5186"]
                 [hiccup "1.0.5"]
                 [org.clojure/clojure "1.7.0-RC1"]
                 [org.clojure/clojurescript "0.0-3308"]
                 [org.clojure/core.async "0.1.346.0-17112a-alpha"]
                 [org.clojure/test.check "0.7.0"]
                 [org.omcljs/om "0.8.8"]
                 [pandeiro/boot-http "0.6.3-SNAPSHOT"]
                 [ring/ring-devel "1.4.0-RC1"]
                 [http-kit "2.1.18"]])

(require
 '[adzerk.boot-cljs      :refer [cljs]]
 '[adzerk.boot-cljs-repl :refer [cljs-repl start-repl]]
 '[adzerk.boot-reload    :refer [reload]]
 '[adzerk.boot-test      :refer [test]]
 '[pandeiro.boot-http    :refer [serve]])

(task-options!
 cljs {:source-map true
       :optimizations :none
       :pretty-print true})

(deftask build
  "Build an uberjar of this project that can be run …
Run Code Online (Sandbox Code Playgroud)

clojure compojure

5
推荐指数
1
解决办法
1162
查看次数