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

urllib访问单镜像返回0B其余镜像正常 如何调试排查

问题根因

空响应是符合HTTP协议标准的正常表现,核心问题是请求方法使用错误:

  • HTTP 协议规范明确定义:HEAD 方法的作用是获取资源的响应头信息,服务器不得返回响应体,通常用于校验资源是否存在、获取文件元数据(大小、修改时间)等不需要下载完整内容的场景。响应头里的Content-Length: 853324指代的是对该资源发起GET请求时会返回的响应体长度,而非HEAD请求本身的响应体长度。
  • 你测试的两个镜像站实现逻辑有差异:dd.weather.gc.ca 未严格遵循协议要求,收到HEAD请求时错误返回了完整响应体,属于非标准行为,所以你能读到文件内容;hpfx.collab.science.gc.ca 严格遵循协议实现,HEAD请求自然返回空响应体。
  • 浏览器访问两个站点都能正常下载,是因为浏览器下载文件时默认发起的是GET请求,而非HEAD请求。
修复方法

将请求方法从HEAD改为默认的GET即可,两个站点都可以正常获取完整文件,修正后的参考代码:

import urllib.request

url = "https://hpfx.collab.science.gc.ca/20220710/WXO-DD/model_gem_global/15km/grib2/lat_lon/12/015/CMC_glb_TCDC_SFC_0_latlon.15x.15_2022071012_P015.grib2"
# 去掉method='HEAD'参数,urllib默认使用GET方法,也可显式指定method='GET'
req = urllib.request.Request(url, headers={'User-Agent': 'Mozilla/5.0'})
with urllib.request.urlopen(req) as resp:
    print(resp.getcode())  # 输出200
    file_content = resp.read()
    print(len(file_content))  # 输出853324,与响应头标注的Content-Length一致
注意事项

如果业务场景只需要获取文件元信息、不需要下载完整文件,可以保留HEAD方法,此时无需读取响应体;如果需要获取文件内容,必须使用GET方法。不要依赖部分服务器对HEAD请求的非标准兼容行为编写代码,这类行为随时可能因为服务端配置调整失效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 04:21:24