从第二个 goroutine 写入 http 响应
Writing http response from an second goroutine
我一直在使用 spotify api 并遇到了一个问题。 context.Context
被使用,因此函数只是“随机”执行。 OAuth 函数应该检查代码是否无效,但如果我不使用通道执行此操作,代码的最后部分将直接执行,甚至 first/second 函数都没有完成。因此,我制作了第二个 goroutine 来检查是否接收到通道,然后写一个响应。但是现在我收到此错误 http: wrote more than the declared Content-Length
我该如何更正 Content-Lenght?为什么还要使用上下文?
我的代码:
// Wrapper: github.com/zmb3/spotify/v2
func WriteResponse(w http.ResponseWriter, h chan *spotify.Client) {
client := <-h
user, err := client.CurrentUser(context.Background())
fmt.Println(user.User.DisplayName)
if err != nil {
_, err := fmt.Fprint(w, "Couldn't get user sorry :(")
if err != nil {
return
}
}
_, err = fmt.Fprintf(w, "Logged in as %s!", user.User.DisplayName)
if err != nil {
log.Println(err)
return
}
}
func OAuth(w http.ResponseWriter, r *http.Request) {
ch := make(chan *spotify.Client)
tok, err := auth.Token(r.Context(), state, r)
if err != nil {
w.WriteHeader(503)
_, err := fmt.Fprint(w, "Couldn't get token sorry :(")
if err != nil {
return
}
}
if st := r.FormValue("state"); st != state {
http.NotFound(w,r)
log.Fatalf("State mismatch: %s != %s\n", st, state)
}
go WriteResponse(w, ch)
client := spotify.New(auth.Client(r.Context(), tok))
ch <- client
}
你忘了return..
if err != nil {
w.WriteHeader(503)
_, err := fmt.Fprint(w, "Couldn't get token sorry :(")
if err != nil {
return
}
// here
return
}
我一直在使用 spotify api 并遇到了一个问题。 context.Context
被使用,因此函数只是“随机”执行。 OAuth 函数应该检查代码是否无效,但如果我不使用通道执行此操作,代码的最后部分将直接执行,甚至 first/second 函数都没有完成。因此,我制作了第二个 goroutine 来检查是否接收到通道,然后写一个响应。但是现在我收到此错误 http: wrote more than the declared Content-Length
我该如何更正 Content-Lenght?为什么还要使用上下文?
我的代码:
// Wrapper: github.com/zmb3/spotify/v2
func WriteResponse(w http.ResponseWriter, h chan *spotify.Client) {
client := <-h
user, err := client.CurrentUser(context.Background())
fmt.Println(user.User.DisplayName)
if err != nil {
_, err := fmt.Fprint(w, "Couldn't get user sorry :(")
if err != nil {
return
}
}
_, err = fmt.Fprintf(w, "Logged in as %s!", user.User.DisplayName)
if err != nil {
log.Println(err)
return
}
}
func OAuth(w http.ResponseWriter, r *http.Request) {
ch := make(chan *spotify.Client)
tok, err := auth.Token(r.Context(), state, r)
if err != nil {
w.WriteHeader(503)
_, err := fmt.Fprint(w, "Couldn't get token sorry :(")
if err != nil {
return
}
}
if st := r.FormValue("state"); st != state {
http.NotFound(w,r)
log.Fatalf("State mismatch: %s != %s\n", st, state)
}
go WriteResponse(w, ch)
client := spotify.New(auth.Client(r.Context(), tok))
ch <- client
}
你忘了return..
if err != nil {
w.WriteHeader(503)
_, err := fmt.Fprint(w, "Couldn't get token sorry :(")
if err != nil {
return
}
// here
return
}