在Go中从前端到后端提交数据

时间:2015-10-20 14:35:22

标签: http go

我有简单的网站。使用JavaScript。现在我收到此消息“http:multiple response.WriteHeader calls”,我知道有另一个标题打开。但我不知道在哪里,我正在努力寻找解决方案。

func (t *Server) RootHandler(w http.ResponseWriter, r *http.Request) {
    var c *entities.Korisnik
    var k *entities.Kilometri
    var a *entities.Auto

    if c = t.authentication(w, r); c == nil {
        return
    }

    gk, err := t.store.GetKilometri(c)

    if errorEval(w, err, http.StatusInternalServerError) {
        return
    }
    if err := r.ParseForm(); err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }

    if r.FormValue("debug") == "true" {
        s, _ := json.MarshalIndent(&Bla{c, gk}, "", "    ")
        w.Write(s)
        return
    } else {
        w.Header().Set("Content-Type", "application/json")
        errorEval(w, json.NewEncoder(w).Encode(&Bla{c, gk}), http.StatusInternalServerError)

    }

    log.Println("0")
    if errorEval(w, json.NewDecoder(r.Body).Decode(&Input{a, k}), http.StatusBadRequest) {
        log.Println("1")
        return
    }
    err = t.store.NewKilometri(k, c, a)
    log.Println("2")
    if errorEval(w, err, http.StatusInternalServerError) {
        return

    }
}

我在终端

中得到了这个
015/10/20 16:12:32 0
2015/10/20 16:12:32 EOF
2015/10/20 16:12:32 http: multiple response.WriteHeader calls
2015/10/20 16:12:32 1
2015/10/20 16:12:32 0
2015/10/20 16:12:32 EOF
2015/10/20 16:12:32 http: multiple response.WriteHeader calls
2015/10/20 16:12:32 1

func errorEval(w http.ResponseWriter, err error, status int) bool {
if err == nil {
    return false
}
log.Println(err)
http.Error(w, errorString[status], status)
return true

}

1 个答案:

答案 0 :(得分:1)

在我看来,errorEval可能会写入状态代码,如果遇到错误,可能是正文。你调用它的大多数地方都会检查返回并从处理程序返回它是否处理错误。

errorEval(w, json.NewEncoder(w).Encode(&Bla{c, gk}), http.StatusInternalServerError)的情况下,您没有检查回报。

我的猜测是,有一些json错误并且处理程序正在编写500响应,并且您继续执行其他操作,而这些操作又会尝试编写其他响应。