调用OpenWeathermap API获取城市天气详情时遭遇404错误,请求排查问题
调用OpenWeathermap API获取城市天气详情时遭遇404错误,请求排查问题
嘿,我来帮你一步步排查这个404错误的可能原因:
多余参数导致API资源识别错误
你当前的URL里加了cnt=1参数,但OpenWeatherMap的/weather接口根本不支持这个参数——cnt是用来指定预报天数的,只适用于/forecast这类接口。多余的参数会让API无法正确识别请求的资源,直接返回404。建议先把这个参数去掉试试。协议不兼容:HTTP vs HTTPS
现在OpenWeatherMap官方推荐用HTTPS协议访问API,你用的HTTP可能会被服务器拒绝或者重定向,进而触发404。把URL开头的http://改成https://应该能解决部分环境下的问题。城市名称未做URL编码
如果传入的城市名称包含空格(比如“New York”)或者特殊字符,直接拼接进URL会导致解析错误。你可以手动对City参数做URL编码,避免这类问题:string encodedCity = Uri.EscapeDataString(City);再把编码后的城市名拼进URL里。
API Key有效性验证
虽然404通常不是密钥的问题,但如果你的API Key未激活或者无效,也可能出现异常。可以先把修改后的URL(替换好城市名和密钥)直接复制到浏览器里访问,看看返回的具体信息,确认密钥是否正常。
这里给你调整后的示例代码,已经修正了上面提到的几个问题:
[HttpPost] public String WeatherDetail(string City) { string appId = "*PUT MY API KEY HERE*"; // 对城市名称进行URL编码,改用HTTPS协议,移除多余的cnt参数 string encodedCity = Uri.EscapeDataString(City); string url = string.Format("https://api.openweathermap.org/data/2.5/weather?q={0}&units=metric&APPID={1}", encodedCity, appId); using (WebClient client = new WebClient()) { string json = client.DownloadString(url); RootObject weatherInfo = (new JavaScriptSerializer()).Deserialize<RootObject>(json); ResultViewModel rslt = new ResultViewModel(); rslt.Country = weatherInfo.sys.country; rslt.City = weatherInfo.name; rslt.Lat = Convert.ToString(weatherInfo.coord.lat); rslt.Lon = Convert.ToString(weatherInfo.coord.lon); rslt.Description = weatherInfo.weather[0].description; rslt.Humidity = Convert.ToString(weatherInfo.main.humidity); rslt.Temp = Convert.ToString(weatherInfo.main.temp); rslt.TempFeelsLike = Convert.ToString(weatherInfo.main.feels_like); rslt.TempMax = Convert.ToString(weatherInfo.main.temp_max); rslt.TempMin = Convert.ToString(weatherInfo.main.temp_min); rslt.WeatherIcon = weatherInfo.weather[0].icon; var jsonstring = new JavaScriptSerializer().Serialize(rslt); return jsonstring; } }
备注:内容来源于stack exchange,提问作者Sir_Ramirez777




