Golang中如何获取前端URL名称

Golang中如何获取前端URL名称 我正在使用 Golang 的 Gin 框架。 我想知道用户是从哪里请求 API 的。(例如 localhost、域名、Postman) 在 Golang Gin 中,ctx.Request.Hostctx.Request.URL.Path 给出的是 API 的主机名和 URL,而不是前端 URL 的名称。

2 回复

请求方地址可以通过 http.Request.RemoteAddr 获取。

通过 http.Request.UserAgent() 获取请求方的设备信息(这取决于请求方发送了什么)。

如果你希望获取更多信息,应该协调请求方向服务器发送相应的信息。

如果你仍然不理解其工作原理,应该查阅 HTTP 协议文档。这不是 Gin 框架需要处理的事情。

更多关于Golang中如何获取前端URL名称的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在 Gin 框架中,可以通过 ctx.Request.Referer() 获取前端页面的 URL。这个字段包含了请求来源页面的完整地址,你可以从中提取域名或路径信息。

示例代码:

package main

import (
    "fmt"
    "net/url"
    "github.com/gin-gonic/gin"
)

func main() {
    r := gin.Default()
    
    r.GET("/api/data", func(c *gin.Context) {
        referer := c.Request.Referer()
        
        if referer != "" {
            // 解析 Referer 获取前端信息
            u, err := url.Parse(referer)
            if err == nil {
                // 获取前端主机名
                frontendHost := u.Host
                // 获取前端路径
                frontendPath := u.Path
                
                c.JSON(200, gin.H{
                    "frontend_host": frontendHost,
                    "frontend_path": frontendPath,
                    "full_referer":  referer,
                })
            }
        } else {
            c.JSON(200, gin.H{
                "message": "No referer header found",
                "source":  "Direct request (e.g., Postman, curl)",
            })
        }
    })
    
    r.Run(":8080")
}

如果请求直接来自 Postman、curl 或浏览器地址栏的直接访问,Referer 头可能为空。这种情况下,可以通过检查 ctx.Request.Header.Get("User-Agent") 来识别请求来源:

func detectSource(c *gin.Context) string {
    referer := c.Request.Referer()
    if referer != "" {
        return "Frontend: " + referer
    }
    
    ua := c.Request.Header.Get("User-Agent")
    if strings.Contains(ua, "PostmanRuntime") {
        return "Postman"
    } else if strings.Contains(ua, "curl") {
        return "curl"
    }
    
    return "Direct browser request"
}

对于需要更精确跟踪的场景,可以考虑让前端在请求头中添加自定义标识:

// 前端请求时添加自定义头
// headers: { 'X-Frontend-Source': 'my-app' }

func handleRequest(c *gin.Context) {
    source := c.Request.Header.Get("X-Frontend-Source")
    if source != "" {
        fmt.Printf("Request from frontend: %s\n", source)
    }
}
回到顶部