我正在使用Go的Gin web框架创建一个端点。我需要在我的处理函数中使用完整的服务器URL。例如,如果服务器在http://localhost:8080上运行,并且我的端点是/foo,那么当我的处理程序被调用时,我需要http://localhost:8080/foo。
如果有人熟悉Python的fast API,那么Request对象有一个url_for(<endpoint_name>)方法,它具有完全相同的功能:https://stackoverflow.com/a/63682957/5353128
在Go中,我尝试访问context.FullPath(),但只返回我的端点/foo,而不是完整的URL。除此之外,我在文档中找不到合适的方法:https://pkg.go.dev/github.com/gin-gonic/gin#Context
那么,这可以通过gin.Context对象本身来实现吗?或者还有其他方法吗?我完全是个新手。
发布于 2021-08-18 17:17:05
c.Request.Host+c.Request.URL.Path应该可以工作,但方案还有待确定。
package main
import (
"fmt"
"github.com/gin-gonic/gin"
)
func main() {
r := gin.Default()
r.GET("/foo", func(c *gin.Context) {
fmt.Println("The URL: ", c.Request.Host+c.Request.URL.Path)
})
r.Run(":8080")
}你可以决定你可能已经知道的方案。但您可以按如下方式进行检查:
scheme := "http"
if c.Request.TLS != nil {
scheme = "https"
}如果您的服务器在代理后面,您可以通过c.Request.Header.Get("X-Forwarded-Proto")获取方案
发布于 2021-08-18 17:21:26
您可以从context.Request.Host获得host part localhost:8080,从context.Request.URL.String()获得path part /foo。
package main
import (
"fmt"
"net/http"
"github.com/gin-gonic/gin"
)
func main() {
r := gin.Default()
r.GET("/foo", func(c *gin.Context) {
c.String(http.StatusOK, "bar")
fmt.Println(c.Request.Host+c.Request.URL.String())
})
// Listen and Server in 0.0.0.0:8080
r.Run(":8080")
}而且你可以通过context.Request.Proto得到http协议的版本,但它不能决定http or https。您需要从您的服务规范中获取它。
https://stackoverflow.com/questions/68836237
复制相似问题