Golang:gorilla - 当参数为空时如何处理对使用 url 参数定义的端点的请求

问题描述 投票:0回答:1

我有这个端点定义:

router.NotFoundHandler = http.HandlerFunc(handlerNotFound)
router.HandleFunc("/customer/{id}", handlerCustUpd).Methods(http.MethodPut)

当调用 URL

https://example.com/customer
https://example.com/customer
时,它永远不会到达 handlerCustUpd ,我可以在其中检查是否存在,也不会到达 handlerNotFound ,也不会返回通用
404 Not Found
错误。它返回
Error: socket hang up
,因为服务器因以下原因失败:

http: panic serving 127.0.0.1:60440: interface conversion: interface {} is nil, not string\ngoroutine 132 [running]:\nnet/http.(*conn).serve.func1()\n\t/usr/local/Cellar/go/1.22.6/libexec/src/net/http/server.go:1903 +0xbe\npanic({0xc05d3a0?, 0xc000c78420?})\n\t/usr/local/Cellar/go/1.22.6/libexec/src/runtime/panic.go:770 +0x132\nbackend/vendors/nexuri.handlerNotFound({0xc11b4f0, 0xc000c36460}, 0xc000c166c0)\n\t/Users/tku/Data/Projects/nexuri/nexuri-backend/backend/vendors/nexuri/handlers-general.go:38 +0x346\nnet/http.HandlerFunc.ServeHTTP(0xc000c165a0?, {0xc11b4f0?, 0xc000c36460?}, 0xc00001b908?)\n\t/usr/local/Cellar/go/1.22.6/libexec/src/net/http/server.go:2171 +0x29\ngithub.com/gorilla/mux.(*Router).ServeHTTP(0xc000180240, {0xc11b4f0, 0xc000c36460}, 0xc000c16480)\n\t/Users/tku/go/pkg/mod/github.com/gorilla/[email protected]/mux.go:212 +0x1e2\ngithub.com/gorilla/handlers.(*cors).ServeHTTP(0xc000194b40, {0xc11b4f0, 0xc000c36460}, 0xc000c16480)\n\t/Users/tku/go/pkg/mod/github.com/gorilla/[email protected]/cors.go:54 +0x335\nnet/http.serverHandler.ServeHTTP({0xc119df0?}, {0xc11b4f0?, 0xc000c36460?}, 0x6?)\n\t/usr/local/Cellar/go/1.22.6/libexec/src/net/http/server.go:3142 +0x8e\nnet/http.(*conn).serve(0xc0002785a0, {0xc11ca80, 0xc0000f0db0})\n\t/usr/local/Cellar/go/1.22.6/libexec/src/net/http/server.go:2044 +0x5e8\ncreated by net/http.(*Server).Serve in goroutine 78\n\t/usr/local/Cellar/go/1.22.6/libexec/src/net/http/server.go:3290 +0x4b4"

任何想法,如何:

  • 让服务器调用处理程序,我可以在其中检查 url 参数的可用性
  • 使服务器响应格式错误的请求(端点不存在)并返回 404 Not Found
  • 让服务器调用handlerNotFound
  • 让服务器不要惊慌并以合理的方式响应

我唯一能弄清楚的是有明确的

PUT: /customer
端点并检查这一点。对于几个端点来说这是可能的,但对于数百个端点来说这是完全不可能的。

我尝试研究 gorilla 包的下一个和文档,并尝试了 ChatGPT。 ;)

提前致谢!

go router handler gorilla panic
1个回答
0
投票

@BurakSerdar 指出了这个问题的解决方案。

handlerNotFound 已正确处理,但由于我使用了尚未设置的上下文(由于未运行中间件 - 这是合乎逻辑的)。

删除此允许返回自定义响应。就我而言,状态 404 未找到状态。

© www.soinside.com 2019 - 2024. All rights reserved.