2015-12-03 5 views
3

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

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

ответ

3

Из-за чтения источника я не вижу способа изменить код состояния (кроме метода, который не позволяет получить сообщение об ошибке). Я думаю, что подразумевается, что если файлы обслуживаются, то это был 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) или независимо от того, если это ваши предпочтения. Какие бы ни были лучшие апартаменты. Мой опыт заключался бы в том, чтобы подготовить объект ответа в области, отличной от области действия мультиплексора, поэтому по этой причине я считаю, что я предпочитаю бит выше (имеет смысл, чем хелпер-методы возвращают неструктурированные данные, которые вы затем записываете в ответственный автоответчик).

+0

Итак, вы сами рекомендуем использовать 'WriteHeader' и' io.WriteString'? – Charles

+0

@Charles, что было бы в одну сторону. Другой вариант - создать экземпляр 'http.Response', чем затем' resp.Write (w) ', и он напишет ответ в' ResponseWriter'. То есть вы можете явно указать любые значения, которые вы хотите, что больше того, о чем я думал. – evanmcdonnal