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

C# HttpClient调用WattTime API传参返回BadRequest/404如何解决

问题原因

你当前的报错核心是两个问题:

  • 你构造了queryString查询参数字符串,但没有拼接到请求的URL中,服务器收不到必填的latitude、longitude参数,因此返回400 Bad Request
  • 手动拼接URL的时候没有处理路径分隔符和参数前缀?的格式问题,导致请求路径错误,因此返回404 Not Found

修正后的完整实现

// 注意:实际生产环境建议HttpClient全局单例,不要每次请求都新建释放
private async void TestLogin()
{
    string tokenValue = string.Empty;
    // 登录逻辑本身无问题,可以保持原有写法
    var handler = new HttpClientHandler
    {
        Credentials = new NetworkCredential("myUsername", "myPassword")
    };
    using (var loginClient = new HttpClient(handler))
    {
        loginClient.BaseAddress = new Uri("https://api2.watttime.org/");
        loginClient.DefaultRequestHeaders.Accept.Clear();
        loginClient.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));
        
        var loginResponse = await loginClient.GetAsync("v2/login");
        if (loginResponse.IsSuccessStatusCode)
        {
            var apiResponse = await loginResponse.Content.ReadAsStringAsync();
            var values = Newtonsoft.Json.JsonConvert.DeserializeObject<Dictionary<string, string>>(apiResponse);
            tokenValue = values["token"];
        }
        else
        {
            Console.WriteLine($"登录失败,状态码:{loginResponse.StatusCode}");
            return;
        }
    }

    // 修正查询区域信息的逻辑
    using (var dataClient = new HttpClient())
    {
        dataClient.BaseAddress = new Uri("https://api2.watttime.org/");
        dataClient.DefaultRequestHeaders.Accept.Clear();
        dataClient.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));
        dataClient.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", tokenValue);

        // 正确拼接查询参数
        var query = System.Web.HttpUtility.ParseQueryString(string.Empty);
        query["latitude"] = "43.80136";
        query["longitude"] = "-91.23958";
        // 最终请求地址 = 接口路径 + ? + 查询参数
        var requestUrl = $"v2/ba-from-loc?{query.ToString()}";
        
        var dataResponse = await dataClient.GetAsync(requestUrl);
        if (dataResponse.IsSuccessStatusCode)
        {
            var result = await dataResponse.Content.ReadAsStringAsync();
            Console.WriteLine($"请求成功,返回结果:{result}");
        }
        else
        {
            // 打印错误返回内容可辅助后续排查问题
            var errorContent = await dataResponse.Content.ReadAsStringAsync();
            Console.WriteLine($"请求失败,状态码:{dataResponse.StatusCode},错误信息:{errorContent}");
        }
    }
}

额外优化建议

  • .NET Core/.NET 5+ 版本可以用QueryHelpers.AddQueryString方法更便捷地构造带参数的请求地址,无需手动处理?拼接逻辑
  • 不要频繁创建销毁HttpClient实例,全局单例复用可以避免socket资源耗尽问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 09:48:03