当前位置:首页 > 文章列表 > Golang > Go问答 > Go net/http Cookie.RawExpires 怎样读取原始 Expires 字段

Go net/http Cookie.RawExpires 怎样读取原始 Expires 字段

来源:17golang原创 2026-10-25 08:49:32 0浏览 收藏

如果你需要保留 Set-Cookie 里的原始过期文本,直接读取 http.Cookie.RawExpires;如果要做时间比较、判断是否已经过期,则读取解析后的 http.Cookie.Expires。这两个字段不是重复数据:一个保留输入形态,一个代表 Go 已经识别出的时间结果。

官方文档:https://pkg.go.dev/net/http#Cookie

RawExpires 适合记录原始值和排查兼容问题,Expires 适合业务判断。解析失败时,原始文本仍可能存在,但 Expires 会保持零值,不能把它当成有效日期。

先分清 RawExpires 和 Expires

http.Cookie 表示响应中的 Set-Cookie 或请求中的 Cookie。其中 RawExpires 是字符串,注释说明它只用于读取 Cookie;Expires 是 time.Time,用于承载解析后的过期时间。

Set-Cookie 中原始 Expires 文本经过 Cookie 解析后分别进入 RawExpires 和 Expires 的静态关系说明图
图1:结构说明图,展示原始 Expires 文本、RawExpires 和 Expires 的字段边界;这是静态说明图,不是运行截图。

在标准格式下,解析过程会保留原始字符串,同时尝试把它转换为 UTC 时间。下面这两个字段应这样理解:

  • RawExpires:原始属性值,例如 Wed, 07-Mar-2012 14:25:06 GMT。
  • Expires:解析后的 time.Time,适合调用 Before、After 或 IsZero。

从 HTTP 响应中读取 RawExpires

客户端请求成功后,可以通过 Response.Cookies() 取得响应里的 Cookie。这个方法已经替你处理了 Set-Cookie 头的解析,得到的每个 Cookie 都可以同时查看两个过期字段。

package main

import (
	"fmt"
	"net/http"
)

func printCookieExpiry(resp *http.Response) {
	for _, cookie := range resp.Cookies() {
		// RawExpires 保留响应头里的原始文本,适合日志和兼容排查。
		fmt.Printf("name=%s raw_expires=%q\\n", cookie.Name, cookie.RawExpires)

		// Expires 是解析结果;零值表示没有可用的解析时间。
		if cookie.Expires.IsZero() {
			fmt.Println("expires=unparsed-or-absent")
			continue
		}
		fmt.Printf("expires=%s\\n", cookie.Expires.UTC().Format("2006-01-02 15:04:05Z"))
	}
}

func main() {
	resp := &http.Response{
		Header: http.Header{
			"Set-Cookie": []string{
				"session=abc; Expires=Wed, 07-Mar-2012 14:25:06 GMT; Path=/",
			},
		},
	}
	printCookieExpiry(resp)
}

真实请求中,把示例里的响应替换成 client.Do(req) 返回的 *http.Response 即可。示例故意使用一个内存中的响应头,只说明字段关系,不代表线上请求结果。

解析成功与失败要分开判断

Go 会把 Expires 的属性值先保存到 RawExpires,再按支持的时间格式解析。如果解析成功,Expires 会得到 UTC 时间;如果格式无法识别,RawExpires 仍可用于诊断,而 Expires.IsZero() 会返回 true。

Cookie 原始字段与解析时间分别服务于日志兼容诊断和业务时间判断的静态关系图
图2:结构说明图,对照 RawExpires 的原始记录用途与 Expires 的业务比较用途;这是静态说明图。
func cookieExpiry(cookie *http.Cookie) (string, time.Time, bool) {
	// 空指针先单独处理,避免错误响应路径触发 panic。
	if cookie == nil {
		return "", time.Time{}, false
	}

	// RawExpires 可能有值,但只有非零 Expires 才能参与时间比较。
	if cookie.Expires.IsZero() {
		return cookie.RawExpires, time.Time{}, false
	}
	return cookie.RawExpires, cookie.Expires.UTC(), true
}

这个返回值设计把“原始数据是否存在”和“是否得到可比较的时间”分开了。调用方可以在日志里保存第一项,也可以只在第三项为 true 时执行过期判断。

按用途选择字段

一个小型 Cookie 处理模块可以按下面的边界分工:

需求优先字段原因
记录服务器原始返回RawExpires保留大小写、格式和异常输入线索
判断是否早于当前时间Expires使用 time.Time 的比较方法
兼容老系统的日期格式两者都保留用原文解释为什么解析结果为空

不要把 RawExpires 当成可直接比较的日期字符串,也不要把零值 Expires 简化成“已经过期”。没有 Expires 属性、解析失败和真正早于当前时间,是三个不同状态。

常见问题

RawExpires 能直接写回 Cookie 吗?

它主要是读取字段。构造要发送的 Cookie 时,应设置规范化的 Expires,再让 Cookie.String() 负责序列化,不要依赖手动修改 RawExpires 产生发送格式。

Expires 是不是总是本地时间?

不是。解析结果按 UTC 归一化后保存,展示时可以按业务时区格式化;比较时优先直接使用 time.Time。

只有 RawExpires 没有 Expires,应该怎么办?

把它当成“有原始输入但没有可用解析结果”,保留原文用于日志或人工排查,不要据此自动延长、删除或刷新 Cookie。

小结

Cookie.RawExpires 的读取方式很直接:从 Response.Cookies() 得到 Cookie 后读取字符串字段即可。真正需要注意的是字段职责:RawExpires 保存输入,Expires 保存可比较的解析结果,IsZero() 用来区分缺失或解析失败。技术依据:https://pkg.go.dev/net/http#Cookie、https://go.dev/src/net/http/cookie.go。

版本声明
本文转载于:17golang原创 如有侵犯,请联系study_golang@163.com删除
Go net/http Response.Body 为什么关闭后连接行为变化(参数形态)Go net/http Response.Body 为什么关闭后连接行为变化(参数形态)
上一篇
Go net/http Response.Body 为什么关闭后连接行为变化(参数形态)
Go http.Transport.HTTP2 怎样设置 HTTP/2 连接参数
下一篇
Go http.Transport.HTTP2 怎样设置 HTTP/2 连接参数
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    543次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    516次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    500次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    485次学习
查看更多
AI推荐
  • PubMedQA数据集详解:生物医学问答基准、功能与应用指南
    PubMedQA
    深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
    681次使用
  • H2O EvalGPT:开源LLM大模型评估与排行榜工具
    H2O EvalGPT
    H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
    698次使用
  • LMArena是什么?伯克利AI模型评估平台使用指南与功能解析
    LMArena
    LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
    743次使用
  • 斯坦福HELM:大语言模型Holistic Evaluation整体评估框架详解
    HELM
    深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
    712次使用
  • MMBench详解:多模态大模型基准测试、功能特点与使用指南
    MMBench
    MMBench是由上海人工智能实验室等机构联合推出的多模态基准测试平台,提供细粒度能力评估、大规模数据集及VLMEvalKit工具。本文详细介绍其核心功能、安装使用方法及应用场景,助力开发者全面评估多模态模型性能。
    550次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议 和 隐私政策
返回登录
  • 重置密码