Golang:终止或中止HTTP请求

时间:2015-07-08 12:52:09

标签: http go error-handling exit abort

使用某些错误消息中止 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而不是调用函数(request)。

1 个答案:

答案 0 :(得分: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))

备注:

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

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

如果在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?