标签: compojure

如何使用 compojure 设置和获取 cookie?

使用创建的项目lein new compojure project-name并让服务器引用(wrap-defaults project-name site-defaults).

在我的处理程序中,我正在调用控制器并将参数传递给这些控制器。项目结构:

handler.clj ;; ring accesses def app
controllers/app.clj ;; where route params are sent
example: (GET "/signup" {params :params} (controller-app/signup params))
Run Code Online (Sandbox Code Playgroud)

所以我遇到的问题是我无法弄清楚如何从控制器文件中获取或设置 cookie。我尝试过的事情:

  • 将 cookie 作为参数传递:{cookies :cookies}。我能够查看默认 cookie,但无法设置任何数据。
  • 使用 cookie-response 和 cookie-request。无法添加到 cookie 的相同问题。
  • 在每条可能的路线中使用 :cookie 并且一无所获。

任何帮助将非常感激。没有太多关于此的文档,因此不幸的是,该问题花费了相当长的时间。

cookies clojure compojure

4
推荐指数
1
解决办法
1122
查看次数

使用部署在Apache Tomcat上的Clojure创建的WAR无法运行Servlet

我创建了Compojure 入门页面上给出的示例WAR,并将其部署到Apache Tomcat 6.0.2 wepapps文件夹中。我使用的Web.xml如下所示:

<web-app>
 <servlet>
   <servlet-name>myservlet</servlet-name>
   <servlet-class>myapp.MyServlet</servlet-class>
 </servlet>
 <servlet-mapping>
   <servlet-name>myservlet</servlet-name>
   <url-pattern>/</url-pattern>
 </servlet-mapping>
</web-app>
Run Code Online (Sandbox Code Playgroud)

访问URL会引发以下错误

java.lang.NullPointerException: Handler returned nil (maybe no routes matched URI)
    compojure.http.servlet$request_handler__72.invoke(servlet.clj:110)
    myapp.MyServlet$_service__108.invoke(MyServlet.clj:11)
    myapp.MyServlet.service(Unknown Source)
Run Code Online (Sandbox Code Playgroud)

我已经将Clojure,Clojure contrib jars包含在WEB-INF / lib文件夹中。

是否有人在Apache Tomcat上遇到Clojure WAR的类似问题?

我尝试运行的Servlet是:

 ;; src/myapp/MyServlet.clj
(ns myapp.MyServlet
    (:use compojure)
    (:gen-class
        :extends javax.servlet.http.HttpServlet))

(defroutes greeter
    (GET "/"
        (html [:h1 "Hello World"])))

(defservice greeter)
Run Code Online (Sandbox Code Playgroud)

当我更换了(defservice greeter)

(run-server {:port 8080}
  "/*" (servlet greeter))
Run Code Online (Sandbox Code Playgroud)

我可以运行它并从浏览器访问URL。

但是,当我从Apache Tomcat运行此程序时,仍然会遇到相同的问题。

tomcat clojure compojure

3
推荐指数
2
解决办法
2307
查看次数

我在哪里可以找到compojure.html?

我开始尝试使用compojure,我想用几个组件示例中的语法创建HTML输出:

(html [:html
        [:head
          [:title "Page title"]]
...
Run Code Online (Sandbox Code Playgroud)

但我正在使用compojure 0.6.2,似乎这个语法不包含在compojure核心中.

如何将其包含在我的项目中?

html clojure compojure

3
推荐指数
1
解决办法
263
查看次数

奇怪的lein uberwar行为

我正在执行lein uberwar我的测试webapp,我收到以下奇怪的错误:

Exception in thread "main" java.lang.ClassCastException: java.lang.Boolean cannot be cast to clojure.lang.Symbol (servlet.clj:1)
Run Code Online (Sandbox Code Playgroud)

servlet.clj包含以下内容:

(ns test.servlet
  (:use ring.util.servlet)
  (:require test.routes :as routes)
  (:gen-class :extends javax.servlet.http.HttpServlet))

(defservice routes/app-routes)
Run Code Online (Sandbox Code Playgroud)

test.routes文件包含:

(ns test.routes
  (:use compojure.core)
  (:require [compojure.route :as route]
            [compojure.handler :as handler]))


(defroutes app-routes
  (GET "/" [] {:status 200
               :headers {"Content-Type" "text/html"}
               :body "<h1>Hello World</h1>"})
  (route/files "/" {:root "static"})
  (ANY "/:s" [s] (str "page-not-found" s)

;; For lein ring-server
;(def test-handler
;  (handler/site app-routes))
Run Code Online (Sandbox Code Playgroud)

奇怪的是,如果我替换线

(:require test.routes :as routes)
Run Code Online (Sandbox Code Playgroud)

附: …

clojure war compojure

3
推荐指数
1
解决办法
854
查看次数

使用来自uberjar的文件响应

从uberjar运行时,Ring的文件响应对我不起作用.我试过了两个

(response/file-response "index.html" {:root "resources/public"})
Run Code Online (Sandbox Code Playgroud)

(response/response (clojure.java.io/as-file (clojure.java.io/resource "public/index.html")))
Run Code Online (Sandbox Code Playgroud)

你如何在uberjar里面的"/"服务index.html?

web-applications jar clojure compojure ring

3
推荐指数
1
解决办法
584
查看次数

如何在Compojure中设置状态代码?

我正在Clojure和Compojure写一个小网站.我想根据找到或未找到的数据为每个请求设置HTTP响应状态.

最后一个调用是html5宏,它将需要发送回浏览器的html返回给处理程序.是否可以在某种程度上设置HTTP响应状态?

(ns myapp.views.layout
  (:require
    [hiccup.page :refer (html5 include-css include-js)]))

(defn layout [title & content]
  (html5
    (head title)
    (body content)))
Run Code Online (Sandbox Code Playgroud)

clojure compojure

3
推荐指数
1
解决办法
1307
查看次数

ring.middleware和compojure:params with keywords

在我的Web处理程序中,我定义了以下内容:

(:require ... 

[ring.middleware.cookies :refer [wrap-cookies]]
            [ring.middleware.multipart-params :refer [wrap-multipart-params]]
            [ring.middleware.params :refer [wrap-params]]
            [ring.middleware.keyword-params :refer [wrap-keyword-params]]
            [ring.middleware.content-type :refer [wrap-content-type]]
            [ring.middleware.format-response :refer [wrap-restful-response]
...)

(def app
  (-> (routes home/my-routes)
      (wrap-cookies)
      (wrap-params)
      (wrap-multipart-params)
      (wrap-keyword-params))))
Run Code Online (Sandbox Code Playgroud)

一切正常.使用看起来像"../test?foo=123"的URL测试卷曲给我一个看起来像{:foo 123}的参数图.但是,显示为关键字的实际上是一个字符串:( keyword?:foo)返回false.

我已经尝试重新安排处理程序并一次删除它们,但无济于事.是否有关于compojure的东西将关键字转换回字符串?谢谢

clojure compojure ring

3
推荐指数
1
解决办法
1111
查看次数

Clojure Ring/Compojure REPL中的动态处理程序更新

我使用了一个新的Compojure Leiningen项目lein new compojure test.Web服务器由lein repl然后运行

user=> (use 'ring.adapter.jetty)
user=> (run-jetty test.handler/app {:port 3000})
Run Code Online (Sandbox Code Playgroud)

路由和应用程序处理程序规范是微不足道的:

(defroutes app-routes
  (GET "/*.do" [] "Dynamic page")
  (route/not-found "Not Found"))

(def app
  (wrap-defaults app-routes site-defaults))
Run Code Online (Sandbox Code Playgroud)

现在,在更改app-routes定义中的任何内容后(例如,将"动态页面"文本更改为其他任何内容,或修改URI匹配字符串),我不会在浏览器中获得更新的文本/路由.但是,当app-routes稍微改变定义时

(defn dynfn [] "Dynamic page fn")
(defroutes app-routes
  (GET "/*.do" [] (dynfn))
  (route/not-found "Not Found"))
Run Code Online (Sandbox Code Playgroud)

我在更改返回值时会获得动态更新dynfn.另外,遵循本文的建议并将app定义修改为

(def app
  (wrap-defaults #'app-routes site-defaults))
Run Code Online (Sandbox Code Playgroud)

(注意#'透明地创建一个var app-routes)也有帮助!

为什么会这样?有没有其他方式可以获得真正的动态行为defroutes

谢谢!

clojure compojure ring read-eval-print-loop

3
推荐指数
1
解决办法
681
查看次数

在运行服务器时注册多个处理程序

有没有办法在运行http-kit服务器时注册多个处理程序:

(defroutes rest-main-app
  (GET "/" "Welcome"))

(defroutes rest-events-app
  (GET "/events" "Event API"))

(defn -main []
  (run-server rest-main-app {:port 5000}))
Run Code Online (Sandbox Code Playgroud)

如何将两个路由都传递给运行服务器,例如rest-main-app和rest-events-app?

clojure compojure ring http-kit

3
推荐指数
1
解决办法
209
查看次数

Compojure ring-json没有返回json

我有这个小程序设置 - 期望/ hello-world端点返回JSON,但HTTP主体是空的...

知道为什么它不返回任何东西?

(ns easycharge.core
  (:use ring.util.response)
  (:require [compojure.core :refer :all]
            [compojure.route :as route]
            [easycharge.routes.payments :as payments]
            [easycharge.db.conn :as db]
            [ring.middleware.defaults :refer :all]
            [ring.middleware.json :as middleware]
            [ring.middleware.cors :refer [wrap-cors]]
             )
  (:gen-class))

(defn std-redirect [] (redirect "https://www.hi.com/404/"))

(defroutes app-routes
           (GET "/payments/:env/:id" [env id] {:hi "there"})
           (GET "/hello-world" [] {:msg "hello-world"})
          ;; (payments/get-payment env id)

           ;; serves anything in resources/public
           (route/resources "/")
           (route/not-found (std-redirect)))

(def app (->
           app-routes
           (wrap-cors :access-control-allow-origin [#".*"]
                      :access-control-allow-methods [:get :put :post :delete])
           (middleware/wrap-json-body {:keywords? true :bigdecimals? …
Run Code Online (Sandbox Code Playgroud)

json clojure compojure ring

3
推荐指数
1
解决办法
1196
查看次数