MST

星途 面试题库

面试题:Go中Context在HTTP服务中的边界情况处理

在一个简单的HTTP服务中,使用Go语言的Context来处理请求的取消。假设客户端可能在处理请求过程中取消请求,你需要编写代码实现以下功能:当请求被取消时,服务端能正确释放资源并返回合适的HTTP状态码。请描述你的实现思路,并给出关键代码片段。
34.7万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

实现思路

  1. 在HTTP处理器函数中获取context.Context对象,该对象可以从http.Request中获取。
  2. 使用context.ContextDone通道来监听取消信号。
  3. 在处理请求的过程中,定期检查Done通道是否接收到取消信号。
  4. 当接收到取消信号时,停止正在进行的操作,释放相关资源,并返回合适的HTTP状态码。

关键代码片段

package main

import (
    "context"
    "fmt"
    "net/http"
    "time"
)

func handler(w http.ResponseWriter, r *http.Request) {
    // 获取请求的上下文
    ctx := r.Context()
    // 模拟一个需要长时间处理的任务
    work := func(ctx context.Context) error {
        select {
        case <-time.After(5 * time.Second):
            return nil
        case <-ctx.Done():
            // 检查是否收到取消信号
            return ctx.Err()
        }
    }

    if err := work(ctx); err != nil {
        if err == context.Canceled {
            // 返回合适的HTTP状态码,这里使用499表示客户端已取消
            w.WriteHeader(http.StatusClientClosedRequest)
            fmt.Fprintf(w, "Request canceled by client")
        } else {
            w.WriteHeader(http.StatusInternalServerError)
            fmt.Fprintf(w, "Internal error: %v", err)
        }
        return
    }
    // 正常处理完成
    w.WriteHeader(http.StatusOK)
    fmt.Fprintf(w, "Request processed successfully")
}

func main() {
    http.HandleFunc("/", handler)
    fmt.Println("Server is listening on :8080")
    http.ListenAndServe(":8080", nil)
}