我如何在 clojure 中使用环处理程序服务器静态 html 文件?

How do i server static html file with ring handler in clojure?

我正在尝试通过基于环 api 服务器路径的服务器 html。但是每次我到达终点时,我都会收到这个奇怪的错误

java.lang.IllegalArgumentException: No implementation of method: :write-body-to-stream of protocol: #'ring.core.protocols/StreamableResponseBody found for class: clojure.lang.PersistentArrayMap
    at clojure.core$_cache_protocol_fn.invokeStatic(core_deftype.clj:583) ~[clojure-1.10.1.jar:?]
    at clojure.core$_cache_protocol_fn.invoke(core_deftype.clj:575) ~[clojure-1.10.1.jar:?]
    at ring.core.protocols$eval18503$fn__18504$G__18494__18513.invoke(protocols.clj:8) ~[?:?]
    at ring.util.servlet$update_servlet_response.invokeStatic(servlet.clj:106) ~[?:?]
    at ring.util.servlet$update_servlet_response.invoke(servlet.clj:91) ~[?:?]
    at ring.util.servlet$update_servlet_response.invokeStatic(servlet.clj:95) ~[?:?]
    at ring.util.servlet$update_servlet_response.invoke(servlet.clj:91) ~[?:?]
    at ring.adapter.jetty$proxy_handler$fn__18623.invoke(jetty.clj:27) ~[?:?]

这是我的 api 返回的内容。

{:status 200
:body   (resource-response "index.html" {:root "public"})}

而如果我直接点击 index.html 路径,则可以通过这条路线访问

http://localhost:8080/index.html

你收到错误 No implementation of method: :write-body-to-stream of protocol: #'ring.core.protocols/StreamableResponseBody found for class: clojure.lang.PersistentArrayMap 因为作为主体你 return PersistentArrayMap 而不是可以编码为 Ring HTTP 响应主体的东西。

resource-response 已经 return 一个完整的响应映射(一个 PersistentArrayMap):

(resource-response "index.html")
;; => {:status 200,
;;     :headers
;;     {"Content-Length" "0", "Last-Modified" "Mon, 16 Nov 2020 14:22:48 GMT"},
;;     :body
;;     #object[java.io.File 0x239d3777 "/index.html"]}

所以不需要将它包装在 {:status 200, :body ...} 中,因为它变成 {:status 200 :body {:status 200, ...}} 会导致该错误。要修复它,您的 API 可以直接 return:

(resource-response "index.html" {:root "public"})