C#使用HttpClient发起HTTPS GET请求调用API返回400错误如何解决
问题根因
Coinbase 公开API会校验请求的User-Agent头合法性,你当前代码中初始化的HttpClient未手动配置该请求头,.NET 默认发出的请求不带合规的UA标识,会直接被接口风控规则拦截返回400错误。这也是浏览器、Postman请求同个接口能正常响应的核心原因:这两类工具会自动在请求中携带合法的UA标识,不会被拦截。
修复代码
首先遵循.NET 官方最佳实践,全局复用单例HttpClient避免套接字资源耗尽,初始化时配置合法UA头,调用时避免用.Result同步阻塞引发死锁:
// 全局单例复用,不要在每次请求时using新建HttpClient private static readonly HttpClient Client = new HttpClient(); // 程序启动阶段执行一次配置即可 Client.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36"); // 接口调用逻辑 var response = await Client.GetAsync("https://api.exchange.coinbase.com/products/ETH-USD/candles?granularity=300&start=2022-03-22&end=2022-03-23"); // 校验请求状态,非200状态码会主动抛出异常方便定位 response.EnsureSuccessStatusCode(); var result = await response.Content.ReadAsStringAsync();
补充说明
- UA头不需要完全仿造浏览器,你也可以自定义为自己的应用标识,比如
"MyCustomApp/1.0",只要UA头不为空,就不会被Coinbase的基础风控拦截 - 禁止使用
.Result、.Wait()这类方法同步阻塞异步HTTP请求,高并发场景下极易出现线程池饿死、请求上下文死锁问题 - 禁止每次请求都新建
HttpClient实例,长时间运行会耗尽系统可用套接字,引发随机的请求失败问题,单例复用是官方推荐的标准用法
内容的提问来源于stack exchange,提问作者scapegoat17
相关产品推荐
相关产品推荐

