我想使用post来更新数据库并且不希望人们手动执行它,也就是说,它应该只能通过客户端中的AJAX来实现.在这种情况下是否有一些众所周知的加密技巧?
假设我发出一个GET请求,将新用户插入我的数据库中site.com/adduser/<userid>.有人可能通过发出虚假请求来过多填充我的数据库.
可能重复:
如何在环项目中运行任意启动功能?
我正在使用clojure环中间件,使用compojure来构建一个简单的api.我经常将应用程序部署为战争.
这很好用,但我正在寻找在应用启动时运行一次初始化代码的方法.当我运行"lein ring server"时它运行得很好 - 但是,当部署为战争时,它似乎只在第一个请求命中服务器时运行(即懒惰).有没有办法让它不是懒惰(不使用AOT) - 或者是否有更好的方法来挂钩环中间件生命周期?
我目前正在使用clojure中的一些REST API,我正在使用带有compojure的ring.middleware.format库来将jSON转换为clojure数据结构.
我遇到了一个很大的问题,因为发布到环形应用程序的JSON会将所有数组替换为数组中的第一个项目.IE它将把这个JSON发布到它
{
"buyer":"Test Name",
"items":[
{"qty":1,"size":"S","product":"Red T-Shirt"},
{"qty":1,"size":"M","product":"Green T-Shirt"}
],
"address":"123 Fake St",
"shipping":"express"
}
Run Code Online (Sandbox Code Playgroud)
对此
{
"buyer": "Test Name",
"items": {
"qty": 1,
"size": "M",
"product": "Green T-Shirt"
},
"address": "123 Fake St",
"shipping": "express"
}
Run Code Online (Sandbox Code Playgroud)
它适用于任何数组,包括数组是根元素时.
我在clojure中使用以下代码来返回json:
(defroutes app-routes
(GET "/"
[]
{:body test-data})
(POST "/"
{data :params}
{:body data}))
;{:body (str "Printing " (count (data :jobs)) " jobs")}))
(def app
(-> (handler/api app-routes)
(wrap-json-params)
(wrap-json-response)))
Run Code Online (Sandbox Code Playgroud)
GET路由没有正确的数组和输出问题,因此它必须是我获取数据或wrap-restful-params中间件的方式.
有任何想法吗?
我正在尝试通过实现一个简单的Web应用程序开始使用Clojure和Clojurescript.到目前为止事情进展顺利,从不同的教程中读到我提出的代码如下:
core.clj:
(ns myapp.core
(:require [compojure.core :as compojure]
[compojure.handler :as handler]
[compojure.route :as route]
[myapp.controller :as controller]))
(compojure/defroutes app-routes
(compojure/GET "/" [] controller/index)
(route/resources "/public")
(route/not-found "Not Found"))
(def app
(handler/site app-routes))
Run Code Online (Sandbox Code Playgroud)
controller.clj:
(ns myapp.controller
(:use ring.util.response)
(:require [myapp.models :as model]
[myapp.templates :as template]))
(defn index
"Index page handler"
[req]
(->> (template/home-page (model/get-things)) response))
Run Code Online (Sandbox Code Playgroud)
templates.clj:
(ns myapp.templates
(:use net.cgrand.enlive-html)
(:require [myapp.models :as model]))
(deftemplate home-page "index.html" [things]
[:li] (clone-for [thing things] (do->
(set-attr 'data-id (:id thing))
(content (:name thing)))))
Run Code Online (Sandbox Code Playgroud)
问题是我无法在页面上显示非ascii字符,我不知道如何在页面上设置HTTP标头. …
作为一个clojure初学者,我正在阅读clojure代码,让自己熟悉Clojure的语法.下面的代码片段是Ring项目中的一个函数
(defn- request-context
"Create an UploadContext object from a request map."
{:tag UploadContext}
[request encoding]
(reify UploadContext
(getContentType [this] (get-in request [:headers "content-type"]))
(getContentLength [this] (or (req/content-length request) -1))
(contentLength [this] (or (req/content-length request) -1))
(getCharacterEncoding [this] encoding)
(getInputStream [this] (:body request))))
Run Code Online (Sandbox Code Playgroud)
我不清楚的是这条线
{:tag UploadContext}
Run Code Online (Sandbox Code Playgroud)
如果审查一个clojure函数的定义
(defn function-name doc-string? attr-map? [parameter-list]
conditions-map?
(expressions))
Run Code Online (Sandbox Code Playgroud)
我猜(但不确定)地图应该是"attr-map?".但什么是"attr-map?"?我google了,找不到好的解释.
任何引入"attr-map"的例子或链接?将不胜感激.我也想知道如何在我粘贴的代码中使用attr-map.
我想弄清楚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) 我想用一个简单的POST请求编写测试ring.mock- 如下所示:
(testing "id post route"
(let [response (app (mock/request :post "/" {:id "Foo"}))]
(is (= 302 (:status response)))))
Run Code Online (Sandbox Code Playgroud)
但是,由于我使用wrap-csrf中间件,因此我得到403状态响应,因为我没有提供防伪令牌.
有没有办法在ring.mock不禁用wrap-csrf中间件的情况下编写POST测试?
使用以下应用程序:
; src/webapp/core.clj
(ns webapp.core
(:require [compojure.core :refer [defroutes GET]]
[ring.middleware.json :as mid-json]
[clj-time.jdbc]))
(defn foo [request]
{:body {:now (org.joda.time.DateTime/now)}})
(defroutes routes
(GET "/foo" [] foo))
(def app
(-> routes
(mid-json/wrap-json-response)))
Run Code Online (Sandbox Code Playgroud)
点击/ foo端点给我这个错误:
com.fasterxml.jackson.core.JsonGenerationException:JSON不能编码类的对象:class org.joda.time.DateTime:2017-10-21T03:38:16.207Z
是否有一种简单的方法可以让ring-json对DateTime对象进行编码?我是否必须编写自己的中间件才能将其转换为例如字符串?如果是这样,我该怎么做?(我以前从未写过环中间件).
我的project.clj有这些依赖项FYI:
[[org.clojure/clojure "1.8.0"]
[org.clojure/java.jdbc "0.6.1"]
[ring/ring-jetty-adapter "1.4.0"]
[compojure "1.4.0"]
[ring/ring-json "0.4.0"]
[clj-time "0.14.0"]]
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) 在包装使用metosin/reitit 创建的特定路由时,我不断收到“无效的防伪令牌” reitit.ring/ring-router。我也试过 reitit 的中间件 registry,但它也不起作用。虽然我可以用wrap-sessionand包装整个处理程序wrap-anti-forgery,但这会破坏 reitit 在允许特定于路由的中间件方面的优势。
(ns t.core
(:require [immutant.web :as web]
[reitit.ring :as ring]
[ring.middleware.anti-forgery :refer [wrap-anti-forgery]]
[ring.middleware.content-type :refer [wrap-content-type]]
[ring.middleware.params :refer [wrap-params]]
[ring.middleware.keyword-params :refer [wrap-keyword-params]]
[ring.middleware.session :refer [wrap-session]]
[ring.util.anti-forgery :refer [anti-forgery-field]]
[ring.util.response :as res]))
(defn render-index [_req]
(res/response (str "<form action='/sign-in' method='post'>"
(anti-forgery-field)
"<button>Sign In</button></form>")))
(defn sign-in [{:keys [params session]}]
(println "params: " params
"session:" session)
(res/redirect "/index.html"))
(defn wrap-af [handler]
(-> handler
wrap-anti-forgery
wrap-session
wrap-keyword-params
wrap-params))
(def …Run Code Online (Sandbox Code Playgroud)