当前位置: 首页 > 面试题库 >

高朗 使用什么?http.ServeFile(..)还是http.FileServer(..)?

督德明
2023-03-14
问题内容

我有点困惑。许多示例都显示了:http.ServeFile(..)和的用法http.FileServer(..),但似乎它们具有非常紧密的功能。我也没有找到有关如何设置自定义NotFound处理程序的信息。

// This works and strip "/static/" fragment from path
fs := http.FileServer(http.Dir("static"))
http.Handle("/static/", http.StripPrefix("/static/", fs))

// This works too, but "/static2/" fragment remains and need to be striped manually
http.HandleFunc("/static2/", func(w http.ResponseWriter, r *http.Request) {
    http.ServeFile(w, r, r.URL.Path[1:])
})

http.ListenAndServe(":8080", nil)

我试图阅读源代码,并且它们都使用serveFile(ResponseWriter, *Request, FileSystem, string, bool)底层函数。但是,http.FileServer返回fileHandler自己的ServeHTTP()方法并在提供文件之前进行一些准备工作(例如path.Clean())。

那么为什么需要这种分离呢?哪种方法更好用?以及如何设置自定义的NotFound处理程序,例如在找不到请求的文件时?


问题答案:

主要区别在于实际上http.FileServer可以将HTTP前缀与文件系统进行几乎1:1的映射。用简单的英语来说,它提供了整个目录路径。以及所有的孩子

假设您有一个名为的目录,/home/bob/static并且您具有以下设置:

fs := http.FileServer(http.Dir("/home/bob/static"))
http.Handle("/static/", http.StripPrefix("/static", fs))

您的服务器将接受的请求,/static/foo/bar并提供/home/bob/static/foo/bar(或404)处的任何内容

相反,它ServeFile是一个较低级别的帮助程序,可用于实现类似于FileServer的功能,或实现自己的可能潜在的麻烦,以及许多其他事情。它只是获取命名的本地文件并通过HTTP连接发送它。就其本身而言,它不会提供整个目录的前缀(除非您编写了一个类似于FileServer进行查找的处理程序)

注意 :天真地为文件系统提供服务是一种潜在的危险(有可能会脱离根目录树),因此,我建议除非您 真的
知道自己在做什么,否则请使用http.FileServer并使用其中http.Dir包括的检查以确保人们可以不要脱离FS,ServeFile事实并非如此。

附录
不幸的是,您的第二个问题,即如何执行自定义的NotFound处理程序,并不容易回答。serveFile正如您所注意到的那样,由于这是从内部函数调用的,因此没有超级容易的地方可以攻入该函数。可能会有一些偷偷摸摸的事情,例如用您自己的ResponseWriter方法拦截响应,从而拦截404响应代码,但我将把练习留给您。



 类似资料:
  • 问题内容: 我将启动一个Java项目来开发桌面应用程序。什么用作表示层模式(MVC,MVP,MVVM或…)? …如果可能的话,给出一些可行的小例子… :-) 问题答案: 其实,你在寻找最终的帖子是 这样回答 这个答案 从卡斯滕Lentzsch共同领导(JGoodies数据的名望)在 秋千框架和最佳实践 旋启式框架和最佳实践 主题。 你好, 多年来,我一直在编写Swing应用程序,很多人都觉得它很优

  • 问题内容: 可能有人解释一下这两个符号之间的细微差别:和。 看起来这两者之间的唯一区别是它返回nil指针或不返回任何指针,但仍为Struct的所有字段分配内存。 问题答案: 这两种形式的和是完全等效的:两个分配零T和一个指针返回到该分配的内存。唯一的区别是,对于像; 这样的内置类型不起作用。你只能做。 该表格并 没有 分配它只是返回一个零指针T.你仅仅是一个混淆的惯用的变种。

  • 从外观上看-似乎创建了一个对象的克隆。如果是这样,那么对于实现可克隆接口(只有不可变对象是新的,因为可变对象有引用复制)的关注,哪一个是最好的,为什么? 我昨天实现了克隆,然后意识到我必须为非字符串/首字母元素提供自己的修改。然后我被告知我现在正在使用的。这两个实现似乎都提供了类似的功能。 谢谢

  • 我正在学习计算机编程,在好几个地方,我偶然发现了内聚的概念,我明白一个软件需要“高内聚”,但它意味着什么?我是一名Java、C和Python程序员,从《C入门》(C Primer)一书中学习C语言,书中提到了内聚性,但索引中没有内聚性,你能给我指出一些关于这个主题的链接吗?我没有发现维基百科页面上关于计算机科学凝聚力的信息,因为它只是说这是一个定性的衡量标准,没有给出真正的代码示例。

  • 我想知道是否有人知道s3前缀到底是什么,以及它如何与amazon发布的s3速率限制交互: AmazonS3自动扩展到高请求率。例如,您的应用程序在一个bucket中每个前缀每秒至少可以实现3500个PUT/POST/DELETE和5500个GET请求。bucket中前缀的数量没有限制。 虽然这很清楚,但我不太确定前缀是什么? 前缀需要分隔符吗? 如果我们有一个存储桶,将所有文件存储在“根”级别(完

  • 问题内容: 什么是高/低算法? 我已经在NHibernate文档中找到了这一点(这是生成唯一密钥的一种方法,第5.1.4.2节),但是我没有找到有关其工作原理的很好的解释。 我知道Nhibernate可以处理它,并且我不需要了解内部,但是我很好奇。 问题答案: 基本思想是,您有两个数字组成主键-“高”数字和“低”数字。客户端可以从本质上增加“高”序列,知道它随后可以安全地从先前的“高”值的整个范围