一尘不染

终止或中止HTTP请求

go

通过某些错误消息中止我的 API 服务的方式是什么?

链接致电我的服务:

http://creative.test.spoti.io/api/getVastPlayer?add=
    {"Json":Json}&host=api0.spoti.io&domain=domain&userAgent=userAgent&mobile=true

要给我的服务打电话,客户需要发送一个Json和一些参数。

我想测试我获得的参数是否正确,否则,我想发送一条错误消息。

响应应为Json代码 {"Result":"Result","Error":"error message"}

我尝试过log.fatalos.Exit(1)他们停止了服务,而不仅仅是通话请求。panic中止通话,但阻止我发送http.ResponseWriter这是我的错误消息。

我读了一些有关 恐慌,推迟,恢复的信息, 但我真的不知道如何使用它们来解决此问题。

return 作品:

mobile :=query.Get("mobile")
if mobile=="mobile" {
            str:=`{"Resultt":"","Error":"No valide Var"}`
            fmt.Fprint(w, str)      
            fmt.Println("No successfull Operation!!")
            return}

但是我只能在main函数中使用它,因为在其他函数中,它仅退出func而不是调用者函数(请求)。


阅读 597

收藏
2020-07-02

共1个答案

一尘不染

终止HTTP请求的服务无非是从ServeHTTP()方法中返回,例如:

http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
    // examine incoming params
    if !ok {
        str := `{"Result":"","Error":"No valide Var"}`
        fmt.Fprint(w, str)
        return
    }

    // Do normal API serving
})

panic(http.ListenAndServe(":8080", nil))

笔记:

如果API服务的输入参数无效,则应考虑返回HTTP错误代码,而不是隐含的default200OK。为此,您可以使用http.Error()函数,例如:

http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
    // examine incoming params
    if !ok {
        http.Error(w, `Invalid input params!`, http.StatusBadRequest) 
        return
    }

    // Do normal API serving
})

对于更复杂的示例,其中您将JSON数据与错误代码一起发送回:

http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
    // examine incoming params
    if !ok {
        w.Header().Set("Content-Type", "application/json")
        w.WriteHeader(http.StatusBadRequest)
        str := `{"Result":"","Error":"No valide Var"}`
        fmt.Fprint(w, str)
        return
    }

    // Do normal API serving
})

显示如何传播“返回”的示例

如果在之外(ServeHTTP()例如在从中调用的函数中)检测到错误,则ServeHTTP()必须返回此错误状态ServeHTTP()才能返回。

假设您具有以下用于所需参数的自定义类型和一个负责根据请求对其进行解码的函数:

type params struct {
    // fields for your params 
}

func decodeParams(r *http.Request) (*params, error) {
    p := new(params)
    // decode params, if they are invalid, return an error:

    if !ok {
        return nil, errors.New("Invalid params")
    }

    // If everything goes well:
    return p, nil
}

使用这些:

http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
    p, err := decodeParams(r)
    if err != nil {
        http.Error(w, `Invalid input params!`, http.StatusBadRequest)
        return
    }

    // Do normal API serving
})
2020-07-02