【问题标题】:Can a Golang SDK expose a REST API via the service intgrating the SDKGolang SDK 能否通过集成 SDK 的服务公开 REST API
【发布时间】:2022-06-10 17:40:20
【问题描述】:
我是 Golang 编程新手,想知道这在 golang 中是否可行。
- 我在 golang 中创建了一个 SDK,它公开了一个 API (/golang-sdk/test-api POST)
- 某些项目将我的 SDK 添加为依赖项
- API (/golang-sdk/test-api) 从服务中公开。
提前致谢!!
P.S:如果可能的话,任何 POC 或这样做的文档都会非常有帮助。
【问题讨论】:
标签:
api
rest
go
sdk
dependencies
【解决方案1】:
欢迎,你会喜欢的:)
我可以想出两种方法:
-
有一个带有处理程序的包,然后在您进行导入的地方处理它们。这样就可以清楚地知道在您进行导入的地方处理哪些端点。通过这种方式,您将拥有更多控制权,并且更易于维护。
-
在您的包含其余 API 的包中,有一个方法可以使用处理程序设置服务器。您可能可以在包的 init 中使用 API 执行此操作,因此无论何时导入 import _ "your_rest_package" 它都会启动,它会启动服务器 - 这是阴暗的,可能更难维护。或者有一个方法来启动你的 API 并根据它在包中使用它。它看起来很整洁,但我仍然不喜欢这个。
【解决方案2】:
是的,这是可能的。您所要做的就是在您的包的(其中一个)init 函数中注册您的 HTTP 处理程序:
package sdk
import (
"net/http"
)
func init() {
http.HandleFunc("/golang-sdk/test-api", TestHandler)
}
func TestHandler(w http.ResponseWriter, r *http.Request) {
// ...
}
只要您的包的用户使用 DefaultServeMux,只需导入您的包即可自动使用您的处理程序:
package main
import (
"log"
"net/http"
_ "your/sdk"
)
func main() {
log.Fatal(http.ListenAndServe(":3000", nil))
}
您的 HTTP 处理程序已导出,因此可以与任何其他 ServeMux 或第三方路由器一起使用,在替代路径下注册,使用身份验证等进行包装,等等。
这正是标准库中的 net/http/pprof 包的工作原理。 Take a look, it's small.
它还展示了另一个好的做法:为 HTTP 处理程序创建一个单独的包。仅导入 runtime/pprof 不会注册 HTTP 处理程序。有一个单独的包,只有那个。向外部公开任何类型的功能都应该是一个有意识的决定,绝非偶然。