You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

调用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

火山引擎 最新活动