gpt4 book ai didi

http - 终止或中止 HTTP 请求

转载 作者:IT王子 更新时间:2023-10-29 00:40:28 24 4
gpt4 key购买 nike

有什么方法可以中止我的 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 这是我的错误消息。

我读到一些关于panic、defer、recover的内容,但我真的不知道如何使用它们来解决这个问题。

return 有效:

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

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

最佳答案

终止 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 错误代码,而不是隐含的默认值 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
})

对于一个更复杂的示例,您发送回 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
})

示例显示如何传播“returning”

如果在 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
})

另请参阅此相关问题:Golang, how to return in func FROM another func?

关于http - 终止或中止 HTTP 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31293314/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com