Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
自动生成ID期间clojure URL缩短器中的错误_Clojure_Compojure_Ring - Fatal编程技术网

自动生成ID期间clojure URL缩短器中的错误

自动生成ID期间clojure URL缩短器中的错误,clojure,compojure,ring,Clojure,Compojure,Ring,我在Clojure编程中遇到了一段代码,它有缺陷。我是Clojure的新手,不知道代码中的bug在哪里 (ns ring-tutorial.core (:require [compojure.handler :as ch] [compojure.core :refer [GET PUT POST defroutes]] [compojure.route :as cr] [ring.util.response :as response])) (

我在Clojure编程中遇到了一段代码,它有缺陷。我是Clojure的新手,不知道代码中的bug在哪里

(ns ring-tutorial.core
  (:require [compojure.handler :as ch]
        [compojure.core :refer [GET PUT POST defroutes]]
        [compojure.route :as cr]
        [ring.util.response :as response]))

(def ^:private counter (atom 0))
(def ^:private mappings (ref {}))

(defn url-for
[id]
(@mappings id))

(defn shorten!
 "Stores the given URL under a new unique identifier and returns it as a string."
 ([url]
 (let [id (swap! counter inc)
       id (Long/toString id 36)] ;;convert to base 36 string
   (or (shorten! url id)
       (recur url))))
([url id] ;;url is provided with an id.
 (dosync
  (when-not (@mappings id)
    (alter mappings assoc id url)
    id))))

(defn retain
 [& [url id :as args]]
(if-let [id (apply shorten! args)]
{:status 201
  :headers {"Location" id}
 :body (list "URL " url " assigned the short identifier " id " \n")}
{:status 409 :body (format "Short URL %s is already taken \n " id)}))

(defn redirect
 [id]
(if-let [url (url-for id)]
(ring.util.response/redirect url) ;;Appropriately redirect the URL based on ethe ID.
{:status 404 :body (str "No such short URL: \n" id)})) ;;Return a 404 if no URL for the particular ID found.

(defroutes app*
 (GET "/" request "Hello World!")
 (PUT "/:id" [id url] (retain url id))
 (POST "/" [url ] (retain url))
 (GET "/:id" [id] (redirect id))
 (GET "/list/" [] (interpose "\n" (keys @mappings)))
 (cr/not-found "Its a 404!\n"))

(def app (ch/api #'app*))
当我运行$CURL-X POST'localhost:8080/?url=' 我得到的URL已被赋予标识符1 当我重新运行命令时,我得到的URL已被赋予标识符2,但它应该标记一个错误,表明yahoo.com已经具有标识符1

这是一个错误,我可以看到,它在缩短!功能,但无法更正它


谢谢

您的
映射
ref指向一个从短ID到长URL的映射。在
中缩短函数,您需要获取一个URL,并查看是否已经为其分配了一个ID。相反,您每次都会生成一个新ID,并在地图中查找它,以查看是否为其分配了URL,这永远不会发生


要解决这个问题,您需要维护长URL到短ID的第二个映射。在
dosync
块中,您将首先在这个新映射中查找URL,如果找不到URL,则生成一个ID并将URL、ID对添加到两个映射中。

因此,我应该创建一个名为mappings2{}的新引用。然后(@mappings2 url)。当不在dosync内时,还有另一个吗?比如(dosync(当不是(@mappings2 url)什么的时候?)我有点困惑,一些代码真的会有帮助