如何使用ClojureScript和Figwheel与后端进行通信?

注意:我是一名经验丰富的程序员,使用clojure但从未进行过严肃的Web开发.

我使用Chestnut设置了一个基本的ClojureScript项目,并且完成了“Hello World”步骤.但是,我真的想和我的后端交谈.为此,我重新定义了试剂代码

(defn greeting []
  [:input {:type "button"
       :value (:text @app-state)
       :on-click #(http/get {})}])

单击时获得404响应.所以至少我和某个人说话.我还可以在server.log文件中看到我的get-requests的证据.然而,在这一点上,我正在努力解决一些概念问题.

首先,http / get是clj-http.client中定义的函数,它不是Chestnut设置的一部分.如果我不得不去寻找图书馆发送基本内容作为获取请求,我觉得我已经偏离了轨道.

其次,用户命名空间的文件具有Chestnut预定义的以下行:

(def http-handler
  (wrap-reload #'mypage.server/http-handler))

(defn run []
  (figwheel/start-figwheel!))

我看不到任何使用http处理程序的地方.所以我不明白这个定义甚至是什么.

另外我理解Figwheel的方式,当我调用“run”时它会启动一个新的web服务器,然后a)服务index.html和b)通过一些TCP端口连接到我的浏览器并开始通过该连接泵送新的JavaScript .第二部分对我来说非常具有推测性.如果这实际发生了什么,我的下一个问题是,如果Figwheel还需要坐在该连接的另一端,或者浏览器是否有一些允许从外部重新加载代码的通用API.

最后我可以告诉我们以某种方式调用mypage / server.clj文件(下面)中定义的循环由和http-handler,因为修改这些会改变get-request中的错误,但是对我来说这是一个完全的谜这很有效.我理解它的方式是我从浏览器发送的get-request被发送到Figwheel-server,即站点的起源.我没有理由相信Figwheel知道我在服务器文件中定义的http处理程序.

(defroutes routes
  (GET "/" _
    {:status 200
     :headers {"Content-Type" "text/html; charset=utf-8"}
     :body (io/input-stream (io/resource "public/index.html"))})
  (resources "/"))

(def http-handler
  (-> routes
      (wrap-defaults api-defaults)
      wrap-with-logger
      wrap-gzip))

最佳答案 对于ClojureScript项目(即不是Clojure),我相信你想要这个:
https://github.com/r0man/cljs-http

点赞