C# API 从 MarketStack 调用并打印值 - 错误 403

C# API call from MarketStack and print values - Error 403

我想进行一次成功的 API 调用,然后打印值以查看它是否有效。我的主要目标是分析数据,在我可以进行成功的 API 调用之后,并构建一个系统的交易策略。

System.Net.Http.HttpRequestException: "响应状态码不表示成功:403(Forbidden)

namespace marketstacktest
{
    class Program
    {
        static async Task Main(string[] args)
        {
            Console.WriteLine("Hello World!");
         
            var options = Options.Create(new MarketstackOptions() { ApiToken = "secretTokenHere" });
            var marketstackService = new MarketstackService(options, NullLogger<MarketstackService>.Instance);

            var appleSymbol = "AAPL";
            var fromDate = DateTime.Now.AddDays(-200);
            var toDate = DateTime.Now;

            //error at the await  System.Net.Http.HttpRequestException: "Response status code does not indicate success: 403 (Forbidden)."

            List<Marketstack.Entities.Stocks.StockBar> stock = await marketstackService.GetStockEodBars(appleSymbol, fromDate, toDate);
            
            foreach (var stock_i in stock)
            {
                Console.WriteLine($"close: {stock_i.Close}");
            }
        }
    }
}

在 API 手册中,直接从 github 中 link 编辑,它提供了有关所有错误代码的信息。这里相关的是这两个:

Code Type Description
403 https_access_restricted HTTPS access is not supported on the current subscription plan.
403 function_access_restricted The given API endpoint is not supported on the current subscription plan.

他们在 github 上的 class 库只是包装了一个 json REST api。每次调用 API 只是一个 http 请求,返回数据作为 json 对象。 403 错误表示您的请求被接受为有效请求,但由于某种原因被服务器故意拒绝。根据文档,错误是因为您的帐户不允许访问 https 或请求类型。

他们的 free-tier 订阅仅包含 end-of-day 数据,这是您所请求的,因此不允许这样做是没有意义的。因此,您的应用几乎可以肯定正在进行 https 调用。

我在他们的快速入门指南的开头找到了示例,并选择了 end-of-day 示例来匹配您的应用程序,然后单击 link。它起作用了,并给出了一堆 json 记录。但是,他们提出的请求使用的是 'http' 而不是 'https'.

将请求更改为 'https' 引发了包含以下内容的 403 响应(为了便于阅读而格式化):

{
    "error":
    {
        "code": "https_access_restricted",
        "message": "Access Restricted - Your current Subscription Plan does not support HTTPS Encryption."
    }
}

至此,我们几乎可以肯定这是您的问题。最后一件事是去查找如何在他们的 class 库中关闭 https 请求。为了避免必须通过代码,我再次检查了页面底部的帮助,并找到了这个(为了便于阅读而格式化):

    var options = Options.Create(new MarketstackOptions(){
        ApiToken = apiKey,
        MaxRequestsPerSecond = 3,
        Https = true 
    });

拜托。这可能应该是他们的第一个示例,因为这是人们最有可能首先尝试的,但事实并非如此。因此,要停止尝试发出 http 请求,您只需在代码中将 Https 选项设置为 false。您只需要将其添加到代码中的选项中,如下所示:

    var options = Options.Create(new MarketstackOptions(){
        ApiToken = "secretTokenHere",
        Https = false
    });

我会把测试留给你,但从浏览器测试中,我们知道请求应该有效,除非他们的库中有错误。根据可用的信息,这几乎肯定是问题所在。