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
相关产品推荐
相关产品推荐

