You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Xero If-Modified-Since过滤器不生效,设置未来时间仍返回全部预算

问题分析与解决建议

你设置If-Modified-Since为未来时间后,未得到预期的空结果反而返回全部预算,可能是以下几个原因导致,对应解决方法如下:

  • 确认预算API端点是否支持If-Modified-Since头
    不是所有Xero API端点都支持这个条件请求头,先核实预算相关端点的文档,确认该头是否被支持。如果端点不支持,这个头会被直接忽略,自然返回全部数据。

  • 修正时间时区问题
    Xero API统一使用UTC时间处理时间戳,你代码里用的DateTime.Now是本地时区时间,转换成未来时间后,在UTC时区下可能仍属于过去时间。改成DateTime.UtcNow.AddDays(2),确保发送的是UTC标准的未来时间值。修改后的代码片段:

    client.DefaultRequestHeaders.IfModifiedSince = DateTime.UtcNow.AddDays(2);
    
  • 纠正对If-Modified-Since行为的误解
    这个请求头的作用是返回指定时间之后被修改过的资源,而非"仅存在于指定时间之后"的资源。如果API对"未来时间"的处理逻辑是视为无效条件,默认返回全部数据,那你需要换用其他过滤方式——比如如果预算API支持按UpdatedDateUTC字段筛选,直接在请求URL中添加该参数来过滤。

  • 验证请求头的实际发送情况
    用调试工具(如Fiddler、Postman)捕获实际发送的请求,检查If-Modified-Since头的格式是否符合HTTP规范,时间值是否正确,确保头被正确传递给API。

修改后的完整代码示例:

var client = new HttpClient();
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", config.AccessToken);
client.DefaultRequestHeaders.Add("xero-tenant-id", config.TenantID);

// 使用UTC时间设置未来2天的时间戳
client.DefaultRequestHeaders.IfModifiedSince = DateTime.UtcNow.AddDays(2);

var response = client.GetAsync(uri).Result;
if (response.IsSuccessStatusCode)
{
    content = response.Content.ReadAsStringAsync().Result;
}

内容的提问来源于stack exchange,提问作者Jack

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 22:47:38