看到很多设置 ResponseWriter
的 Content-Type
属性都是直接在代码里写MIME类型,其实Golang中有根据文件扩展名查询MIME类型的方法,在 mime
package中,函数名称是 TypeByExtension
,文档 在这里 。传入扩展名(比如 .txt
, .json
),返回MIME类型。不过,对于一些特别常见的MIME类型,比如HTML,JSON这些,直接在代码里写上字符串,要比每次用 mime
这个package查询MIME类型性能要好。
所以可以写这样几个辅助函数,直接用字符串设置常见的MIME类型(HTML, JSON和Form表单), 不常见的MIME类型可以通过内部查询 TypeByExtension
来完成。
import ( "net/http" "mime" ) func SetHTMLContentType(w http.ResponseWriter) { setContentType(w, "text/html") } func SetJSONContentType(w http.ResponseWriter) { setContentType(w, "application/json") } func SetFormContentType(w http.ResponseWriter) { setContentType(w, "x-www-form-urlencoded") } func SetContentTypeFromExtension(w http.ResponseWriter, extension string) { mime := mime.TypeByExtension(extension) if mime != "" { w.Header().Set("Content-Type", mime) } } func setContentType(w http.ResponseWriter, contentType string) { w.Header().Set("Content-Type", contentType) }
所以假设要把一个HTML按照纯文本的MIME类型下发,可以这样:
// resWriter变量是http.ResponseWriter类型 SetContentTypeFromExtension(resWriter, ".txt") fmt.Fprint(resWriter, "<html><body><h1>2</h1></body></html>")