在这个简单的Clojure Ring应用程序中获取默认index.html文件以具有正确的Content-Type的正确方法是什么?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在这个简单的Clojure Ring应用程序中获取默认index.html文件以具有正确的Content-Type的正确方法是什么?相关的知识,希望对你有一定的参考价值。

直截了当,我不确定是否遗漏了一个晦涩的选项,我对线程化中间件顺序的理解对于事情发生的时间是完全正确的,或者如果我可能使用了错误的工具工作。


这是使用ClojureCompojure Ringmiddleware应用程序的简化片段:

(def app
   (-> handler
      (wrap-file "public")   ; If the route is a static file in public, serve it instead
      (wrap-content-type)))  ; Deduce and add the proper Content-Type header

目的是提供任何routes,但是如果public目录中有本地文件,则改为提供它,最后添加一个有意义的Content-Type标头和相应的mime type这一切都很好。


问题是当我浏览至基本URL时,它does按预期提供index.html,但not却获得了text/html的Content-Type,但是application/octet-stream

这是一个问题,如何通过响应正文的内容分配Content-Type?

但是,不建议使用middleware reads the :body common problems,因为它是一个可变的InputStream,只能读取一次。因此,显然这不是正确的方法。

默认情况下是否有更好的方法来提供index.html?

当前的丑陋解决方法是使用特殊情况下的路由来手动设置Content-Type。

探讨中间件的执行顺序及其后果:

诚然,尽管我了解线程宏(:body)的原因是->转换为(-> x A B),但在计算执行流程解决的order时,我仍然有些困惑中间件链到带有路由的最终处理程序。造成这种绊脚石的原因是,代码可能在调用传递给它的处理程序之前弄乱了请求,并且在返回之前弄乱了响应。知道我要在何时添加细节或与响应混在一起来扩大请求时,或者需要根据某种条件进行不同行为的更为复杂的情况时,并不需要感到“显而易见”。

例如,(B (A x) )发生在处理程序构造响应之前还是之后,因为顺序在线程中很重要?我觉得这对我来说应该更直观,而不必像我所做的那样跑到wrap-file

[似乎有source code,可能是我对中间件和处理程序之间的区分比我应该做的要多。

交换顺序(以测试线程顺序假设)不符合您的想法:

middleware applied only when a specific route matches

它“有效”,但是出于错误原因(def app ; THIS IS AN EXAMPLE OF BROKEN CODE - DON'T USE IT (-> handler (wrap-content-type))) ; WRONG ORDER - DON'T DO THIS (EXAMPLE ONLY) (wrap-file "public") ; WRONG ORDER - DON'T DO THIS (EXAMPLE ONLY) 文件将被传递并“正确”呈现,但这仅是因为添加了[[no Content-Type。由于缺少指定的mime类型,浏览器做出了有根据的猜测,并且恰巧正确猜测。

由于目标

在标头中具有Content-Type,所以这表明开始的线程顺序是正确的。 因此掌握了不该做的事情的信息,

应该

在URL未按名称指定时提供默认状态index.html文件的原因,因为没有扩展名检查?
    [WORKS-index.html(服务于具有正确的MIME类型的页面)]
  • BROKEN-http://localhost/index.html(服务于同一页面,但内容类型错误,因此浏览器尝试下载它)]
  • 是否有更好的中间件堆栈,甚至是推荐的中间件堆栈,以便有人可以引导我通过?
  • 答案
    您可以通过将适当的映射条目添加到html响应映射的http://localhost/条目中来设置Content-Type或任何其他标头:

    :headers

    请注意,(assoc-in response [:headers "Content-Type"] "text/html")
    是响应图中的关键字,而:headers"Content-Type"是纯字符串。

    以上是关于在这个简单的Clojure Ring应用程序中获取默认index.html文件以具有正确的Content-Type的正确方法是什么?的主要内容,如果未能解决你的问题,请参考以下文章

    如何在 Clojure/Compojure/Ring 中将映射转换为 URL 查询字符串?

    如何关闭 clojure ring web 应用程序中的 Hikari 连接池部署到 elasticbeanstalk 中的 tomcat

    在 Clojure/Compojure 中转义/清理用户输入

    何时在Clojure Web应用程序中创建多个线程?

    Leiningen、Compojure、Luminus 和 Ring 是啥关系?

    GraphQL Clojure:获取 GQL 查询字段