在这个简单的Clojure Ring应用程序中获取默认index.html文件以具有正确的Content-Type的正确方法是什么?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在这个简单的Clojure Ring应用程序中获取默认index.html文件以具有正确的Content-Type的正确方法是什么?相关的知识,希望对你有一定的参考价值。
直截了当,我不确定是否遗漏了一个晦涩的选项,我对线程化中间件顺序的理解对于事情发生的时间是完全正确的,或者如果我可能使用了错误的工具工作。
这是使用Clojure和Compojure Ring的middleware应用程序的简化片段:
(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
。
ring.middleware.file/wrap-file表示
index-files?
选项默认为true,这解释了为什么没有路径的URL可以正确地为文件提供服务。这似乎是serving static resources的古怪方式。ring.middleware.content-type/wrap-content-type表示MIME类型是由URI中的文件扩展名推断的,没有默认值是
application/octet-stream
。由于URL包含no filename,因此此功能正在“正确地”执行其声明的状态。
这是一个问题,如何通过响应正文的内容分配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-
- BROKEN-http://localhost/index.html(服务于同一页面,但内容类型错误,因此浏览器尝试下载它)]
index.html
(服务于具有正确的MIME类型的页面)]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 中转义/清理用户输入