我已经启动了一个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构建一个简单的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的任意实例.
知道如何有效和优雅地做到这一点?
我正在尝试提高客户端从我的 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标头。不是一项艰巨的任务,但也不是一项简单的任务。
这是否已经存在于某处?我找不到它,但它似乎是一项足够常见且足够大的任务,以至于现在有人会为它编写一个库。
我一直在将一些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) 我想弄清楚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) 我正在创建一个简单的 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的新手,也是一个完整的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上它也会出现一条线.
是否需要其他东西才能获得格式化输出?
我想在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是可选的?
谢谢!
我正在开发一个RESTful应用程序,我需要将来自http地址的请求重定向到它的https等效项.我似乎无法使用ring/compojure启用https.
任何人都有一些有用的教程和/或链接?我还没找到.
文档也没有任何用处.
我有两个感兴趣的文件: 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)