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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 17:57:33