C#调用DISCOS在线API获取JSON返回数据的请求实现问题求助
问题原因
你现有代码无法获取正确接口响应,核心是3个问题:
- 混用了
HttpClient和旧版HttpWebRequest两套HTTP客户端逻辑:你给HttpClient配置的所有请求规则(响应格式要求、授权信息),在后续新建HttpWebRequest实例时完全不会继承,等于实际发出去的请求既没带鉴权凭证,也没声明需要JSON格式返回,服务端自然不会返回你要的结果。 - 请求路径配置错误:你创建请求时传入的是站点根地址,没有拼接目标接口路径
/api/objects,根本没请求到正确的接口地址。 - 授权头格式不符合规范:
AuthenticationHeaderValue构造函数第一个参数需要传入鉴权方案,该API使用Bearer Token鉴权,你直接传入Token字符串会导致授权头格式错误,服务端无法识别你的授权身份。
修正方案
全程使用你已经声明的静态HttpClient发请求即可,不需要混用旧的HttpWebRequest,首先确保引入以下必须的命名空间:
using System; using System.Net.Http; using System.Net.Http.Headers; using System.IO; using System.Threading.Tasks;
可直接运行的完整代码如下:
class Program { // 全局静态HttpClient是官方推荐用法,可避免频繁创建客户端导致的端口耗尽问题 static readonly HttpClient client = new HttpClient(); static async Task Main(string[] args) { // 注意BaseAddress末尾要加斜杠,避免路径拼接出错 client.BaseAddress = new Uri("https://discosweb.esoc.esa.int/"); client.DefaultRequestHeaders.Accept.Clear(); // 必须指定该Accept头,匹配API要求的JSON:API响应格式 client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/vnd.api+json")); // 替换为你自己的有效Token,第一个参数固定传"Bearer" client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", "替换为你自己的实际Token值"); try { // 明确请求目标接口路径 HttpResponseMessage response = await client.GetAsync("api/objects"); // 先校验请求状态,状态码异常时直接抛出错误方便排查 response.EnsureSuccessStatusCode(); // 读取接口返回的JSON字符串 string jsonContent = await response.Content.ReadAsStringAsync(); // 将JSON内容写入本地文件存储 File.WriteAllText("discos_objects.json", jsonContent); Console.WriteLine($"请求成功,状态码:{response.StatusCode},数据已保存到本地discos_objects.json文件"); } catch (HttpRequestException e) { Console.WriteLine($"请求出错:{e.Message}"); } } }
补充说明
- 上述代码用了
async/await异步写法,是.NET中HTTP请求的标准实现方式,如果你使用的是较老版本.NET不支持异步Main,可以在同步Main方法中通过.GetAwaiter().GetResult()调用异步逻辑,但不推荐长期使用同步阻塞写法。 - 该接口默认开启分页,单次请求最多返回100条数据,如果需要拉取全量数据,循环请求时带上
?page[number]=页码&page[size]=每页条数参数即可,直到返回数据条数为0时停止拉取。 - 如果确认Token有效但仍返回403错误,可检查你的账号Token是否拥有
objects接口的访问权限。
内容的提问来源于stack exchange,提问作者Alec
相关产品推荐
相关产品推荐

