news 2026/4/16 18:15:41

go gin userAgent如何解析是手机还是PC

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
go gin userAgent如何解析是手机还是PC

在 Gin 框架中解析 User-Agent 判断设备类型,可以通过手动解析第三方库实现,推荐结合Gin 中间件使用。以下是具体方案:

一、手动解析(零依赖)

直接在 Gin 处理器中检查 User-Agent 字符串,适合简单场景:

go

复制

package main import ( "net/http" "strings" "github.com/gin-gonic/gin" ) // IsMobile 判断是否为移动设备 func IsMobile(userAgent string) bool { if userAgent == "" { return false } ua := strings.ToLower(userAgent) mobileKeywords := []string{ "mobile", "android", "iphone", "ipad", "ipod", "windows phone", "phone", "pad", "symbian", "blackberry", "nokia", "samsung", "htc", } for _, keyword := range mobileKeywords { if strings.Contains(ua, keyword) { return true } } return false } func main() { r := gin.Default() r.GET("/", func(c *gin.Context) { userAgent := c.GetHeader("User-Agent") deviceType := "PC端" if IsMobile(userAgent) { deviceType = "移动端" } c.JSON(http.StatusOK, gin.H{ "user_agent": userAgent, "device_type": deviceType, }) }) r.Run(":8080") }

二、使用第三方库(推荐)

1. 使用mileusna/useragent

安装:

bash

复制

go get github.com/mileusna/useragent

Gin 集成示例:

go

复制

package main import ( "net/http" "github.com/gin-gonic/gin" "github.com/mileusna/useragent" ) func main() { r := gin.Default() r.GET("/", func(c *gin.Context) { uaString := c.GetHeader("User-Agent") ua := useragent.Parse(uaString) c.JSON(http.StatusOK, gin.H{ "user_agent": uaString, "device": ua.Device, // PC / Phone / Tablet / Bot "os": ua.OS, "browser": ua.Name, "version": ua.Version, "mobile": ua.Device == "Phone" || ua.Device == "Tablet", }) }) r.Run(":8080") }

2. 使用mssola/useragent

安装:

bash

复制

go get github.com/mssola/useragent

Gin 集成示例:

go

复制

package main import ( "net/http" "github.com/gin-gonic/gin" "github.com/mssola/useragent" ) func main() { r := gin.Default() r.GET("/", func(c *gin.Context) { uaString := c.GetHeader("User-Agent") ua := useragent.New("") ua.Parse(uaString) c.JSON(http.StatusOK, gin.H{ "user_agent": uaString, "mobile": ua.Mobile(), "os": ua.OS(), "browser": ua.Name(), "version": ua.Version(), "device_type": func() string { if ua.Mobile() { return "移动端" } return "PC端" }(), }) }) r.Run(":8080") }

三、最佳实践:Gin 中间件模式

将设备类型判断逻辑封装为中间件,供全局或局部路由使用:

go

复制

package main import ( "net/http" "strings" "github.com/gin-gonic/gin" ) // DeviceType 设备类型常量 const ( DevicePC = "pc" DeviceMobile = "mobile" DeviceTablet = "tablet" ) // DeviceInfo 设备信息 type DeviceInfo struct { Type string UserAgent string } const deviceInfoKey = "_device_info" // DeviceMiddleware 设备检测中间件 func DeviceMiddleware() gin.HandlerFunc { return func(c *gin.Context) { userAgent := c.GetHeader("User-Agent") deviceType := detectDevice(userAgent) // 将设备信息存储到 Gin Context c.Set(deviceInfoKey, DeviceInfo{ Type: deviceType, UserAgent: userAgent, }) // 为模板渲染添加全局变量 c.Set("isMobile", deviceType == DeviceMobile) c.Set("isPC", deviceType == DevicePC) c.Next() } } // detectDevice 检测设备类型 func detectDevice(userAgent string) string { if userAgent == "" { return DevicePC } ua := strings.ToLower(userAgent) // 平板识别 tabletKeywords := []string{"ipad", "android pad", "tablet", "kindle"} for _, keyword := range tabletKeywords { if strings.Contains(ua, keyword) { return DeviceTablet } } // 手机识别 mobileKeywords := []string{ "mobile", "android", "iphone", "ipod", "windows phone", "phone", "symbian", "blackberry", "nokia", "htc", } for _, keyword := range mobileKeywords { if strings.Contains(ua, keyword) { return DeviceMobile } } return DevicePC } // GetDeviceInfo 从Context获取设备信息 func GetDeviceInfo(c *gin.Context) (DeviceInfo, bool) { info, exists := c.Get(deviceInfoKey) if !exists { return DeviceInfo{}, false } return info.(DeviceInfo), true } func main() { r := gin.Default() // 应用全局中间件 r.Use(DeviceMiddleware()) // 路由示例 r.GET("/", func(c *gin.Context) { deviceInfo, _ := GetDeviceInfo(c) c.JSON(http.StatusOK, gin.H{ "device_type": deviceInfo.Type, "user_agent": deviceInfo.UserAgent, "message": func() string { switch deviceInfo.Type { case DeviceMobile: return "您正在使用移动设备访问" case DeviceTablet: return "您正在使用平板设备访问" default: return "您正在使用PC访问" } }(), }) }) // 为移动端和PC端返回不同内容 r.GET("/home", func(c *gin.Context) { deviceInfo, _ := GetDeviceInfo(c) if deviceInfo.Type == DeviceMobile { c.String(http.StatusOK, "移动端首页") return } c.String(http.StatusOK, "PC端首页") }) r.Run(":8080") }

四、方案对比

表格

复制

方案优点缺点推荐场景
手动解析无依赖、性能最好准确率一般、需维护关键词简单项目、对性能要求极高
第三方库准确率高、功能完整增加依赖、性能略低复杂项目、需要详细设备信息
中间件模式代码复用、逻辑清晰轻微性能损耗所有 Gin 项目(最佳实践)

生产环境建议:使用第三方库 + 中间件组合,平衡准确性与开发效率。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/15 13:38:46

基于springboot的师生互动桥系统的设计与实现(源码+论文+部署+安装)

感兴趣的可以先收藏起来,还有在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,我会一一回复,希望可以帮到大家。一、程序背景在教育数字化转型深入推进、师生互动与教学管理需求多元化的背景下,传统教学管理…

作者头像 李华
网站建设 2026/4/16 9:22:12

字节序:跨设备数据交互核心指南

目录 一、大小端的核心定义与存在意义 1. 大小端的本质 2. 为什么必须处理大小端? 二、大小端的 3 类经典处理方法 方法 1:字节拆分与拼接法(通用基础版) 代码实现(以 32 位整数为例) 方法 2&#x…

作者头像 李华
网站建设 2026/4/16 10:02:53

基于STM32F103C8T6的模拟温湿度接收系统:下位机部分1

引言:本篇主要讲述用STM32CubeMx初始化单片机以及FreeRtos,利用随机数模拟温湿度再通过UART异步通信串口到上位机电脑,Wifi模块会在部分2中。STM32CubeMx中时钟、引脚、中断等初始化配置。基础系统配置RCC这里开启高速时钟即可,选…

作者头像 李华
网站建设 2026/4/16 9:20:57

限时开放内测!Open-AutoGLM PC即将闭源,现在上车还来得及

第一章:Open-AutoGLM PC内测背景与战略意义 Open-AutoGLM PC版的内测标志着通用大语言模型在本地化智能代理领域迈出了关键一步。该版本聚焦于将AutoGLM的核心能力迁移至个人计算设备,实现离线环境下的自主任务规划、代码生成与系统交互,推动…

作者头像 李华
网站建设 2026/4/16 1:14:37

支付即裂变:让顾客变你的终身推销员

做活动时顾客热闹,活动一停立马冷清?你的门店是否也陷入了“促销依赖症”的怪圈?打折送券换来的是价格敏感型顾客,他们毫无忠诚度可言。更令人焦虑的是,商户之间互为孤岛,无法共享客流,商圈整体…

作者头像 李华
网站建设 2026/4/16 12:47:04

Open-AutoGLM部署避坑指南(20年经验专家私藏配置清单泄露)

第一章:Open-AutoGLM部署避坑指南核心概述在部署 Open-AutoGLM 过程中,开发者常因环境配置、依赖版本冲突或模型加载方式不当导致服务启动失败。本章聚焦关键部署环节中的典型问题,提供可落地的解决方案与最佳实践建议。环境准备与依赖管理 确…

作者头像 李华