Изменение HTTP-кода с помощью http.ServeFile

Я пишу сервер на Go, и в настоящее время я реализую страницы ошибок (404, 500 и т. д.). У меня есть файлы, которые можно обслуживать для этих ошибок, но если я использую http.ServeFile, то я получаю HTTP-код 200 вместо соответствующий код.

Есть ли способ изменить код состояния или мне нужно переписать http.ServeFile для этого варианта использования?


person Charles    schedule 03.12.2015    source источник


Ответы (1)


Из чтения источника я не вижу никакого способа изменить код состояния (кроме сбоя метода, что означает, что вы не получите свою страницу с ошибкой). Я думаю, подразумевается, что если файлы обслуживаются, то это был HTTP 200, что не совсем необоснованно.

Я рекомендую прочитать файл страницы ошибки в строку, а затем использовать этот метод; https://golang.org/pkg/net/http/#Error

РЕДАКТИРОВАТЬ: На самом деле это может быть недостаточно конкретным для вас. Он хочет, чтобы сообщение об ошибке было в виде простого текста, поэтому то, что я предложил, скорее всего, используется не по назначению. В этом случае у вас не останется полезных абстракций, чтобы делать то, что вы хотите.

В ответ на комментарий мое личное предпочтение было бы чем-то вроде;

func main() {
    mux := http.NewServeMux()
    mux.HandleFunc("/sendstrailers", func(w http.ResponseWriter, req *http.Request) {
        resp := &http.Response{
            StatusCode: 404,
        }
        resp.Write(w)
    })
}

но вы также можете просто использовать w.WriteHeader(http.StatusForbidden) или что-то еще, если это ваше предпочтение. Какие бы лучшие апартаменты вам ни понадобились. Мой опыт связан с подготовкой объекта ответа в области действия, отличной от области действия мультиплексора, поэтому я думаю, что предпочитаю приведенный выше бит (это имеет больше смысла, чем когда вспомогательные методы возвращают неструктурированные данные, которые вы затем записываете в средство записи ответов).

person evanmcdonnal    schedule 03.12.2015
comment
Итак, вы рекомендуете использовать WriteHeader и io.WriteString напрямую? - person Charles; 03.12.2015
comment
@ Чарльз, это был бы один из способов. Другой вариант — создать экземпляр http.Response, а затем выполнить resp.Write(w), и он запишет ответ в файл ResponseWriter. Это было то, что вы можете явно установить любые значения, которые вы хотите, о чем я думал. - person evanmcdonnal; 03.12.2015