/// <summary>
        /// Build URL with parameters.
        /// </summary>
        /// <param name="apiKey"></param>
        /// <param name="function"></param>
        /// <param name="parameters"></param>
        /// <returns></returns>
        public static string ComposeUrl(
            string apiKey,
            ApiFunctions function,
            IDictionary<ApiParameters, string> parameters = null
            )
        {
            if (string.IsNullOrEmpty(apiKey))
            {
                throw new ArgumentNullException(AvResources.ApiKeyIsNullException);
            }

            if (function == ApiFunctions.Unknown)
            {
                throw new ArgumentException(AvResources.UnknownApiFunctionException);
            }


            var urlParameters = new Dictionary<string, string>
            {
                { ApiParametersDic.GetWord(ApiParameters.Function), function.ToString() }, //func is only first, because validation
                { ApiParametersDic.GetWord(ApiParameters.ApiKey), apiKey }
            };

            if (parameters?.Any() == true)
            {
                foreach (var pair in parameters)
                {
                    urlParameters.Add(ApiParametersDic.GetWord(pair.Key), pair.Value);
                }
            }

            var stringUrl = QueryHelpers.AddQueryString(AlphaVantageConstants.BaseAddress, urlParameters);

            AlphaVantageApiCallValidator.IsValid(stringUrl);

            return stringUrl;
        }
示例#2
0
        static AlphaVantageApiCallValidator()
        {
            //Examples:
            //from_symbol=EUR
            //to_symbol=EUR
            //datatype = csv
            //market=CNY
            //series_type: close, open, high, low
            //slowlimit=0.01
            //slowperiod=26
            //signalperiod=9
            //fastmatype=0
            //slowmatype=0
            //signalmatype=0
            //fastkperiod=5
            //slowkmatype=0
            //fastdmatype=0
            //fastdperiod=0
            //timeperiod1=7
            //timeperiod2=14
            //timeperiod3=28
            //acceleration=0.01
            //maximum=0.20

            var apiFunctions = Enum.GetValues(typeof(ApiFunctions)) as ApiFunctions[];
            var outputSize   = Enum.GetValues(typeof(OutputSize)) as OutputSize[];

            var patterns = new List <string>();

            var apiFunctionsPattern = $"{ApiParametersDic.GetWord(ApiParameters.Function)}=({string.Join("|", apiFunctions.Where(q => q > 0).Select(q => q.ToString()))})";

            var symbolPattern = $"{ApiParametersDic.GetWord(ApiParameters.Symbol)}=([0-9a-zA-Z.-]" + "{3,})"; //numbers?

            patterns.Add(symbolPattern);

            var intervalsPattern = $"{ApiParametersDic.GetWord(ApiParameters.Interval)}=({string.Join("|", Intervals.Values)})";

            patterns.Add(intervalsPattern);

            var outputSizePattern = $"{ApiParametersDic.GetWord(ApiParameters.OutputSize)}=({string.Join("|", outputSize.Where(q => q > 0)).ToLower()})";

            patterns.Add(outputSizePattern);

            var apikeyPattern = $"{ApiParametersDic.GetWord(ApiParameters.ApiKey)}=(([0-9A-Z]" + "{16})|demo)";

            patterns.Add(apikeyPattern);

            var symbolsPattern = $"({ApiParametersDic.GetWord(ApiParameters.FromSymbol)}|{ApiParametersDic.GetWord(ApiParameters.ToSymbol)})=([0-9]" + "{3,5})" + "([a-zA-Z]" + "{1,5})";

            patterns.Add(symbolsPattern);

            var dataTypePattern = $"{ApiParametersDic.GetWord(ApiParameters.DataType)}=({string.Join("|", Enum.GetNames(typeof(GettingDataType))).ToLower()})";

            patterns.Add(dataTypePattern);

            var marketPattern = $"{ApiParametersDic.GetWord(ApiParameters.Market)}=([A-Z]" + "{3,})" + "([a-z]" + "{1,})";

            patterns.Add(marketPattern);

            var keyWordsPattern = $"{ApiParametersDic.GetWord(ApiParameters.KeyWords)}=([a-zA-Z]" + "{3,})";

            patterns.Add(keyWordsPattern);

            var seriesTypePattern = $"{ApiParametersDic.GetWord(ApiParameters.SeriesType)}=({string.Join("|", Enum.GetNames(typeof(SeriesType))).ToLower()})";

            patterns.Add(seriesTypePattern);

            var floatingNumbersPattern =
                $"(" +
                $"{ApiParametersDic.GetWord(ApiParameters.SlowLimit)}" +
                $"|{ApiParametersDic.GetWord(ApiParameters.Acceleration)}" +
                $"|{ApiParametersDic.GetWord(ApiParameters.Maximum)}" +
                $")=" + "([0-9]([.,][0-9]{1,3}))";

            patterns.Add(floatingNumbersPattern);

            var integersPattern =
                $"(" +
                $"{ApiParametersDic.GetWord(ApiParameters.SignalPeriod)}" +
                $"|{ApiParametersDic.GetWord(ApiParameters.SignalPeriod)}" +
                $"|{ApiParametersDic.GetWord(ApiParameters.FastMaType)}" +
                $"|{ApiParametersDic.GetWord(ApiParameters.SlowMaType)}" +
                $"|{ApiParametersDic.GetWord(ApiParameters.SignalMaType)}" +
                $"|{ApiParametersDic.GetWord(ApiParameters.FastKPeriod)}" +
                $"|{ApiParametersDic.GetWord(ApiParameters.SlowKmaType)}" +
                $"|{ApiParametersDic.GetWord(ApiParameters.FastDmaType)}" +
                $"|{ApiParametersDic.GetWord(ApiParameters.FastDPeriod)}" +
                $"|{ApiParametersDic.GetWord(ApiParameters.TimePeriod)}([0-9]" + "{0,1})" + ")=([0-9]{1,4})";

            patterns.Add(integersPattern);

            _callPattern =
                $@"^{AlphaVantageConstants.BaseAddress.Replace(@"/", @"\/")}\?{apiFunctionsPattern}" +
                $@"(\&({string.Join('|', patterns)}))+$";

            _urlRegex = new Regex(_callPattern);
        }