如何为所有API端点全局设置http.ResponseWriter Content-Type标头? [英] How to set http.ResponseWriter Content-Type header globally for all API endpoints?
本文介绍了如何为所有API端点全局设置http.ResponseWriter Content-Type标头?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我是Go语言的新手,现在正在用它构建一个简单的API:
I am new to Go and I'm building a simple API with it now:
package main
import (
"encoding/json"
"fmt"
"github.com/gorilla/mux"
"github.com/gorilla/handlers"
"log"
"net/http"
)
func main() {
port := ":3000"
var router = mux.NewRouter()
router.HandleFunc("/m/{msg}", handleMessage).Methods("GET")
router.HandleFunc("/n/{num}", handleNumber).Methods("GET")
headersOk := handlers.AllowedHeaders([]string{"Authorization"})
originsOk := handlers.AllowedOrigins([]string{"*"})
methodsOk := handlers.AllowedMethods([]string{"GET", "POST", "OPTIONS"})
fmt.Printf("Server is running at http://localhost%s\n", port)
log.Fatal(http.ListenAndServe(port, handlers.CORS(originsOk, headersOk, methodsOk)(router)))
}
func handleMessage(w http.ResponseWriter, r *http.Request) {
vars := mux.Vars(r)
message := vars["msg"]
response := map[string]string{"message": message}
w.Header().Set("Content-Type", "application/json") // this
json.NewEncoder(w).Encode(response)
}
func handleNumber(w http.ResponseWriter, r *http.Request) {
vars := mux.Vars(r)
number := vars["num"]
response := map[string]string{"number": number}
w.Header().Set("Content-Type", "application/json") // and this
json.NewEncoder(w).Encode(response)
}
我觉得在我拥有的每个API函数中重复重复w.Header().Set("Content-Type", "application/json")
行是不干净的.
I feel like it's not clean to keep repeating w.Header().Set("Content-Type", "application/json")
line in every API function that I have.
所以我的问题是,是否可以为我拥有的所有API函数全局设置http.ResponseWriter Content-Type标头?
So my question here is, does it possible to set that http.ResponseWriter Content-Type header globally for all API functions that I have?
推荐答案
您可以为多路复用器路由器定义middleware
,下面是一个示例:
You can define middleware
for mux router, here is an example:
func main() {
port := ":3000"
var router = mux.NewRouter()
router.Use(commonMiddleware)
router.HandleFunc("/m/{msg}", handleMessage).Methods("GET")
router.HandleFunc("/n/{num}", handleNumber).Methods("GET")
// rest of code goes here
}
func commonMiddleware(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.Header().Add("Content-Type", "application/json")
next.ServeHTTP(w, r)
})
}
在文档
这篇关于如何为所有API端点全局设置http.ResponseWriter Content-Type标头?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文