请求参数双重编码致时区无效:Europe%2FBerlin转Europe%252FBerlin请求失败
解决Open-Meteo API请求中Timezone参数重复编码问题
问题重现
使用以下参数字典和请求代码调用Open-Meteo归档API时,出现时区参数错误:
参数字典
payload = { 'latitude': 42.406747, 'longitude': 12.154226, 'timezone': 'Europe%2FBerlin', # 手动编码的时区值 'time_format': 'iso8601', 'temperature_unit': 'celsius', 'wind_speed_unit': 'ms', 'precipitation_unit': 'mm', 'start_date': '2023-05-20', 'end_date': '2023-05-23', 'models': ['best_match', 'era5', 'era5_land'], 'hourly': ['temperature_2m', 'relativehumidity_2m', 'dewpoint_2m', 'apparent_temperature', 'pressure_msl', 'surface_pressure', 'precipitation', 'rain', 'snowfall', 'weathercode', 'cloudcover', 'cloudcover_low', 'cloudcover_mid', 'cloudcover_high', 'shortwave_radiation', 'direct_radiation', 'diffuse_radiation', 'direct_normal_irradiance', 'windspeed_10m', 'windspeed_100m', 'winddirection_10m', 'winddirection_100m', 'windgusts_10m', 'et0_fao_evapotranspiration', 'vapor_pressure_deficit', 'soil_temperature_0_to_7cm', 'soil_temperature_7_to_28cm', 'soil_temperature_28_to_100cm', 'soil_temperature_100_to_255cm', 'soil_moisture_0_to_7cm', 'soil_moisture_7_to_28cm', 'soil_moisture_28_to_100cm', 'soil_moisture_100_to_255cm'] }
请求代码
import requests # 注:原代码存在拼写错误,应为requests而非request api_url = "https://archive-api.open-meteo.com/v1/archive" response = requests.get( url= api_url, params=payload )
错误结果
生成的请求URL中,timezone参数被二次编码为Europe%252FBerlin,服务器返回错误:
{ "reason": "Invalid timezone", "error": true }
问题原因
requests.get()方法的params参数会自动对所有参数值执行URL编码。提前手动将时区编码为Europe%2FBerlin,会导致%被再次编码为%25,最终变成服务器无法识别的Europe%252FBerlin。
解决方案
直接使用未编码的原始时区字符串,让requests库自动处理编码:
修正后的参数字典
payload = { 'latitude': 42.406747, 'longitude': 12.154226, 'timezone': 'Europe/Berlin', # 使用原始格式,无需手动编码 'time_format': 'iso8601', 'temperature_unit': 'celsius', 'wind_speed_unit': 'ms', 'precipitation_unit': 'mm', 'start_date': '2023-05-20', 'end_date': '2023-05-23', 'models': ['best_match', 'era5', 'era5_land'], 'hourly': ['temperature_2m', 'relativehumidity_2m', 'dewpoint_2m', 'apparent_temperature', 'pressure_msl', 'surface_pressure', 'precipitation', 'rain', 'snowfall', 'weathercode', 'cloudcover', 'cloudcover_low', 'cloudcover_mid', 'cloudcover_high', 'shortwave_radiation', 'direct_radiation', 'diffuse_radiation', 'direct_normal_irradiance', 'windspeed_10m', 'windspeed_100m', 'winddirection_10m', 'winddirection_100m', 'windgusts_10m', 'et0_fao_evapotranspiration', 'vapor_pressure_deficit', 'soil_temperature_0_to_7cm', 'soil_temperature_7_to_28cm', 'soil_temperature_28_to_100cm', 'soil_temperature_100_to_255cm', 'soil_moisture_0_to_7cm', 'soil_moisture_7_to_28cm', 'soil_moisture_28_to_100cm', 'soil_moisture_100_to_255cm'] }
修正后,requests会自动将Europe/Berlin编码为Europe%2FBerlin,服务器能正确识别时区参数,请求即可正常返回数据。
内容的提问来源于stack exchange,提问作者Gianni Spear
相关产品推荐
相关产品推荐

