Golang:终止或中止HTTP请求

abd*_*del 4 error-handling http exit go abort

使用某些错误消息中止我的API服务的方法是什么?

链接拨打我的服务:

http://creative.test.spoti.io/api/getVastPlayer?add=
    {"Json":Json}&host=api0.spoti.io&domain=domain&userAgent=userAgent&mobile=true
Run Code Online (Sandbox Code Playgroud)

要调用我的服务,客户端需要发送一个Json和一些参数.

我想测试我得到的参数是否正确,如果不是我想发送错误信息.

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

我试过log.fatal,os.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}  
Run Code Online (Sandbox Code Playgroud)

但我只能在main函数中使用它,因为在其他函数中它只退出func而不是调用函数(request).

icz*_*cza 6

终止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))
Run Code Online (Sandbox Code Playgroud)

笔记:

如果API服务的输入参数无效,则应考虑返回HTTP错误代码而不是隐含的默认值200 OK.为此,您可以使用该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
})
Run Code Online (Sandbox Code Playgroud)

有关更复杂的示例,其中您发送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
})
Run Code Online (Sandbox Code Playgroud)

显示如何传播"返回"的示例

如果在外部检测到错误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
}
Run Code Online (Sandbox Code Playgroud)

使用这些:

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
})
Run Code Online (Sandbox Code Playgroud)

另请参阅此相关问题:Golang,如何从func FROM另一个函数返回?