首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从Gin中的任何端点处理程序获取完整的服务器URL

如何从Gin中的任何端点处理程序获取完整的服务器URL
EN

Stack Overflow用户
提问于 2021-08-18 16:38:56
回答 2查看 2.6K关注 0票数 2

我正在使用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对象本身来实现吗?或者还有其他方法吗?我完全是个新手。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-08-18 17:17:05

c.Request.Host+c.Request.URL.Path应该可以工作,但方案还有待确定。

代码语言:javascript
复制
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")
}

你可以决定你可能已经知道的方案。但您可以按如下方式进行检查:

代码语言:javascript
复制
scheme := "http"
if c.Request.TLS != nil {
    scheme = "https"
}

如果您的服务器在代理后面,您可以通过c.Request.Header.Get("X-Forwarded-Proto")获取方案

票数 3
EN

Stack Overflow用户

发布于 2021-08-18 17:21:26

您可以从context.Request.Host获得host part localhost:8080,从context.Request.URL.String()获得path part /foo

代码语言:javascript
复制
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。您需要从您的服务规范中获取它。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68836237

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档