Как установить заголовок http.ResponseWriter Content-Type глобально для всех конечных точек API?

Я новичок в Go и сейчас создаю простой API:

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)
}

Мне кажется, что повторять строку w.Header().Set("Content-Type", "application/json") в каждой имеющейся у меня функции API - это не совсем правильно.

Итак, мой вопрос: можно ли установить этот заголовок http.ResponseWriter Content-Type глобально для всех функций API, которые у меня есть?

Спасибо, @Peter.

Zulhilmi Zainudin 21.07.2018 15:05
Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
27
2
27 755
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете определить middleware для мультиплексорного маршрутизатора, вот пример:

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)
    })
}

Подробнее читайте в документация

Прекрасно работает. Большое спасибо.

Zulhilmi Zainudin 21.07.2018 15:05

Я не понимаю, кошерно ли здесь писать на ResponseWriter. Из текущие документы: «Промежуточное ПО должно писать в ResponseWriter, если они собираются завершить запрос, и они не должны писать в ResponseWriter, если они не собираются его прерывать».

tom d 17.05.2019 02:59

Это не заголовок написать. Только метод WriteHeader.

Зелёный 17.05.2019 08:36

ах! Что объясняет его. Спасибо за разъяснения и быстрый ответ.

tom d 17.05.2019 18:40

Другие вопросы по теме