【问题标题】: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 中是否可行。

  1. 我在 golang 中创建了一个 SDK,它公开了一个 API (/golang-sdk/test-api POST)
  2. 某些项目将我的 SDK 添加为依赖项
  3. API (/golang-sdk/test-api) 从服务中公开。

提前致谢!!

P.S:如果可能的话,任何 POC 或这样做的文档都会非常有帮助。

【问题讨论】:

    标签: api rest go sdk dependencies


    【解决方案1】:

    欢迎,你会喜欢的:)

    我可以想出两种方法:

    1. 有一个带有处理程序的包,然后在您进行导入的地方处理它们。这样就可以清楚地知道在您进行导入的地方处理哪些端点。通过这种方式,您将拥有更多控制权,并且更易于维护。

    2. 在您的包含其余 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 处理程序。有一个单独的包,只有那个。向外部公开任何类型的功能都应该是一个有意识的决定,绝非偶然。

      【讨论】:

        猜你喜欢
        • 2020-07-01
        • 2018-06-12
        • 2015-05-30
        • 2012-08-19
        • 2012-11-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-07
        相关资源
        最近更新 更多