如何在Compojure/Ring中区分html vs xhr/xml/json请求,类似于Rails中的respond_to?
http://apidock.com/rails/ActionController/MimeResponds/respond_to
是否可以定义包含多个参数的compojure路径?
即:
(def my-routes
(routes
(GET "/something/:param1/:param2" [] my-handler)))
Run Code Online (Sandbox Code Playgroud) 我试图使用clojure kORMa与compojure,webapp在这里nepleaks.
首先,我添加了kORMa依赖
[korma "0.3.0-RC4"]
Run Code Online (Sandbox Code Playgroud)
lein deps很酷,然后创建src/hotel/conf/datasource.clj,如下所示:
(ns hotel.conf.datasource)
(use [korma.db])
(use [korma.core])
)
(defdb db (mysql {:db "nepleaks"
:user "root"
:password "mysql55"}))
(defentity users)
Run Code Online (Sandbox Code Playgroud)
lein ring server 既没有抛出任何异常也没有创建数据库实体.
我错过了什么吗?我需要更多配置吗?
我正在使用Dmitri Sotnikov的"使用Clojure进行Web开发"来学习如何构建Web应用程序.当我尝试运行一些代码来访问数据库时,会发生一些编译错误:
跑完之后
>莱恩环服务器
我有:
Compiling tonglindb.models.db
Exception in thread "main" java.lang.RuntimeException: No such var: sql/create-table, compiling:(tonglindb/models/db.clj:10:3)
at clojure.lang.Compiler.analyze(Compiler.java:6380)
at clojure.lang.Compiler.analyze(Compiler.java:6322)
at clojure.lang.Compiler$InvokeExpr.parse(Compiler.java:3573)
at clojure.lang.Compiler.analyzeSeq(Compiler.java:6562)
at clojure.lang.Compiler.analyze(Compiler.java:6361)
at clojure.lang.Compiler.analyze(Compiler.java:6322)
at clojure.lang.Compiler$BodyExpr$Parser.parse(Compiler.java:5708)
at clojure.lang.Compiler$FnMethod.parse(Compiler.java:5139)
at clojure.lang.Compiler$FnExpr.parse(Compiler.java:3751)
at clojure.lang.Compiler.analyzeSeq(Compiler.java:6558)
at clojure.lang.Compiler.analyze(Compiler.java:6361)
at clojure.lang.Compiler.analyzeSeq(Compiler.java:6548)
at clojure.lang.Compiler.analyze(Compiler.java:6361)
at clojure.lang.Compiler.access$100(Compiler.java:37)
at clojure.lang.Compiler$DefExpr$Parser.parse(Compiler.java:529)
at clojure.lang.Compiler.analyzeSeq(Compiler.java:6560)
at clojure.lang.Compiler.analyze(Compiler.java:6361)
at clojure.lang.Compiler.analyze(Compiler.java:6322)
at clojure.lang.Compiler.compile1(Compiler.java:7148)
at clojure.lang.Compiler.compile(Compiler.java:7219)
at clojure.lang.RT.compile(RT.java:398)
at clojure.lang.RT.load(RT.java:438)
at clojure.lang.RT.load(RT.java:411)
at clojure.core$load$fn__5018.invoke(core.clj:5530)
at clojure.core$load.doInvoke(core.clj:5529)
at clojure.lang.RestFn.invoke(RestFn.java:408)
at clojure.core$load_one.invoke(core.clj:5336)
at clojure.core$compile$fn__5023.invoke(core.clj:5541)
at clojure.core$compile.invoke(core.clj:5540)
at user$eval9.invoke(form-init2674485681777655551.clj:1)
at clojure.lang.Compiler.eval(Compiler.java:6619)
at …Run Code Online (Sandbox Code Playgroud) 我有一个使用 Compojure 和此类端点的应用程序
(defroutes routes
(POST "/api/v1/echo" req (str req))
(def http-handler
(reload/wrap-reload (wrap-defaults #'routes api-defaults)))
(defn run-web-server []
(run-jetty http-handler {:port 10555 :join? false}))
Run Code Online (Sandbox Code Playgroud)
当我尝试这个卷曲请求时
curl -X POST -H "Content-Type: application/json" http://localhost:10555/api/v1/echo -d '{"hello": "world"}'
Run Code Online (Sandbox Code Playgroud)
我得到这个回应
{:ssl-client-cert nil, :remote-addr "0:0:0:0:0:0:0:1", :params {}, :route-params {}, :headers {"accept" "*/*", "user-agent" "curl/7.43.0", "content-type" "application/json", "content-length" "18", "host" "localhost:10555"}, :server-port 10555, :content-length 18, :form-params {}, :query-params {}, :content-type "application/json", :character-encoding nil, :uri "/api/v1/echo", :server-name "localhost", :query-string nil, :body #object[org.eclipse.jetty.server.HttpInput 0x4317e5fa "org.eclipse.jetty.server.HttpInput@4317e5fa"], :scheme :http, …Run Code Online (Sandbox Code Playgroud) 如何在compojure中绑定动态变量?请参阅下面的示例,这里request-id是为每个api请求生成的唯一uuid.我希望能够访问该请求ID在随后的方法记录等等.我已经使用绑定功能试过,但我仍然无法访问请求ID的some-page/some-method.
handler.clj
(ns some_app.handler
(:require
[compojure.api.sweet :refer :all]
[compojure.route :as route]
[some_api.some_page :as some-page]))
(def ^:dynamic *request-id*
nil)
(defn ^:private generate-request-id []
(str (java.util.UUID/randomUUID)))
(def app
(binding [*request-id* (generate-request-id)]
(api
(context "/api" [] (GET "/some-page" [] (some-page/some-method))))))
Run Code Online (Sandbox Code Playgroud)
一些-page.clj
(ns some_app.some_page
(:require
[clojure.tools.logging :as log]))
(def some-method []
(log/info {:request-id *request-id*}))
Run Code Online (Sandbox Code Playgroud) 我尝试lein new compojure financeiro使用 midje 框架在 leiningen 的 compojure 模板 ( ) 中运行测试并收到警告:
lein midje
WARNING: any? already refers to: #'clojure.core/any? in namespace: leiningen.midje, being replaced by: #'leiningen.midje/any?
nil
All checks (3) succeeded.
Run Code Online (Sandbox Code Playgroud)
我的测试代码handler_test.clj:
lein midje
WARNING: any? already refers to: #'clojure.core/any? in namespace: leiningen.midje, being replaced by: #'leiningen.midje/any?
nil
All checks (3) succeeded.
Run Code Online (Sandbox Code Playgroud)
我的项目文件project.clj:
(ns financeiro.handler-test
(:require
; [clojure.test :refer :all]
[midje.sweet :refer :all]
[ring.mock.request :as mock]
[financeiro.handler :refer :all]))
; (deftest test-app …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用自定义:store选项wrap-multipart-params,而我明显得到默认商店.我的自定义函数甚至没有被调用.
(mp/wrap-multipart-params
(POST "/upload-x" request (upload/upload-file request))
{:store upload/logging-store})
Run Code Online (Sandbox Code Playgroud)
我的日志存储功能看起来像这样(它现在只是一个虚拟 - 最终我想以自定义方式处理流)这些IO都没有发生.
(defn logging-store [{filename :filename
content-type :content-type
stream :stream
:as params}]
(println "in logging store")
(pprint filename)
(pprint params)
filename)
Run Code Online (Sandbox Code Playgroud)
upload-file看起来像这样:
(defn upload-file [{params :params
session :session :as request}]
(let [user-id (:user-id session)
files (get params "files")]
(pprint request)
(pprint params)
(response/response
{:status :success})))
Run Code Online (Sandbox Code Playgroud)
请求和参数的打印清楚地显示了那里的多部分参数,并且它们由临时文件存储处理:
:multipart-params
{"files"
{:size 1674,
:tempfile
#<File /var/folders/rx/9ntjyyvs35qbmcbp6rhfmj200000gn/T/ring-multipart-3853352501927893381.tmp>,
:content-type "application/octet-stream",
:filename "blog-test.clj"}},
Run Code Online (Sandbox Code Playgroud)
编辑:应用程序定义(根据要求)
(defroutes file-list-routes
(GET "/simple-upload" request (upload/simple-upload-file request))
(mp/wrap-multipart-params …Run Code Online (Sandbox Code Playgroud) 我正在尝试将一些数据添加到app引擎数据存储区中.这是我的功能
(defn createUser [email phone roleId status]
(println (db/isIdExist "users" "email" email))
(if (db/isIdExist "users" "email" email)
(str "false")
((db/addUser email phone roleId status) (str "true"))))
Run Code Online (Sandbox Code Playgroud)
在这里我想根据isIdExist函数的值打印false (如果电子邮件已经存在,则返回true,否则为false)现在当我运行它时,如果isIdExist == true那时它打印为false但是当isIdExist == false它在数据存储区中添加值但是给出了这个错误.有人可以帮助为什么会发生这种情况,我在这里错过了什么概念?谢谢
我传递路径参数来从数据库中获取数据.
终点
http://localhost:3000/hello/1000
GET方法代码
码
(ns clojure-dauble-business-api.core
(:require [compojure.api.sweet :refer :all]
[ring.util.http-response :refer :all]
[clojure-dauble-business-api.logic :as logic]
[clojure.tools.logging :as log]
[clojure-dauble-business-api.domain.artwork])
(:import [clojure_dauble_business_api.domain.artwork Artwork]))
(defapi app
(GET ["/hello/:id", :id #"[0-9]+"] [id]
(log/info "Function begins from here" id)
(ok {:artwork (logic/artwork-id id)})))
Run Code Online (Sandbox Code Playgroud)
当我从邮递员到达终点时,我收到此错误,
org.postgresql.util.PSQLException: ERROR: operator does not exist: integer = character varying
Run Code Online (Sandbox Code Playgroud)
我已经知道值id作为String值传递给查询.
在传递给Query之前,将Path参数类型更改为Number的最佳方法是什么?