为了账号安全,请及时绑定邮箱和手机立即绑定

终止或中止 HTTP 请求

终止或中止 HTTP 请求

Go
慕尼黑8549860 2021-10-18 17:18:16
用一些错误消息中止我的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.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}  但是我只能在 main 函数中使用它,因为在其他函数中它只退出 func 而不是调用者函数(请求)。
查看完整描述

1 回答

?
江户川乱折腾

TA贡献1851条经验 获得超5个赞

终止 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 错误代码而不是隐含的 default 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

})


查看完整回答
反对 回复 2021-10-18
  • 1 回答
  • 0 关注
  • 260 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信